如何为自己的VPS服务器安装免费SSL证书
2015年12月5日更新:Let’s Encrypt是一个专门提供免费SSL证书的非盈利性CA机构,极大地方便了申请免费SSL证书的过程。因此现在我不推荐使用下面的方法。
大多数的CA证书都要花钱买,不过有一个叫StartCOM的CA机构为个人提供的证书是免费的。他们的网址是startssl.com,你可以在Firefox浏览器和Chrome浏览器的Certificate Manager受信任的CA机构中找到StartCOM这个公司。
下面,我将一步一步教你如何向StartSSL申请一个证书并安装在自己的Linux VPS服务器上。你可以将CA证书安装在web服务器上,也可以安装在自己的邮件服务器上。
在StartSSL网站注册
StartSSL网站不使用账号和密码来登录,而是使用个人证书来验证用户登录。前往StartSSL注册页面,填写你的个人信息。注意,邮箱地址不要填写QQ邮箱!否则不能接收验证码。
点击Continue后,他们会给你的邮箱发一个验证码。将验证码粘贴在文本框中。
验证通过后,将会转到一个页面,生成一个私钥。这个私钥保存在浏览器中。点击Continue生成私钥。然后他们会要求安装证书,点击Install安装。
证书会安装在你的浏览器中。记住这个证书不是我们最终要的SSL证书,而是我们登录StartSSL网站的个人证书。
域名验证
点击Control Panel进入控制面板
然后点击Validation Wizard标签,进入验证向导页面。选择Domain Name Validation进行域名验证。
输入你的域名
然后,他们会查询域名的whois信息,并询问你要使用哪个邮箱来接收验证码,其中有个邮箱就是whois信息查询出来的邮箱。选择一个可用的邮箱地址。
他们会发一个验证码到你的邮箱,在文本框中输入验证码以证明你是域名的所有者。
验证成功。
取得CA证书
首先我们需要生成私钥。StartSSL可以为你生成一个私钥,但私钥最好是自己来生成。因为CA证书的私钥只有自己可以看,不能给任何他人看。
登录Linux VPS服务器,输入下面的命令生成一个4096位的RSA私钥。
openssl genrsa -aes256 -out my-private-encrypted.key 4096
你将被要求输入一个Pass Phrase,Pass Phrase要足够长,能有多复杂就要多复杂,并记住它。输入完Pass Phrase后,一个经过加密的私钥就生成了。这个私钥保存在my-private-encrypted.key文件中。
下一步是将私钥解密(decrypt),输入下面的命令:
openssl rsa -in my-private-encrypted.key -out my-private-decrypted.key
它将要求你输入之前的Pass Phrase。正确输入Pass Phrase后,私钥就被解密了,保存在my-private-decrypted.key文件中。
现在,生成一个证书签发请求(CSR)。
openssl req -new -sha256 -key my-private-decrypted.key -out mydomain.com.csr
-key 后面的参数就是解密的私钥。公钥由经过解密的私钥生成,并嵌入在CSR文件中。将mydomain.com替换成你的域名,比如我的是linuxbabe.com。它将要求你输入一些信息。我们可以一路按回车键,不输入信息,因为StartSSL不会理睬CSR文件中的这些信息,它只关心CSR里的公钥。
openssl req -in mydomain.com.csr -noout -pubkey
输入下面命令查看CSR申请人的信息以及公钥和签名信息:
openssl req -text -in mydomain.com.csr -noout
向StartSSL提交CSR并获取证书
返回到StartSSL网站的控制面板(Control Panel),点击“Certificates Wizard”(证书向导)标签。不管你是申请Web服务器的证书还是邮件服务器的证书,Certificate Target都要选择Web Server SSL/TLS Certificate。
然后StartSSL想要为你生成一个私钥,因为我们自己生成了私钥,所以点击“Skip”跳过这一步。
下一步是提交CSR,在VPS服务器上输入下面的命令
cat mydomain.com.csr
将cat命令的输出结果全部复制并粘贴到文本框中。
成功提交了CSR。
现在选择之前通过验证的域名,我的是linuxbabe.com
然后它要求你输入一个二级域名,也就是主机名。如果你的服务器是web服务器那么可以输入www,如果你的服务器是邮件服务器,那么这个二级域名要对应MX记录的主机名。我的邮件服务器的MX记录如下:
@ MX mail.linuxbabe.com
主机名是mail.linuxbabe.com,所以我输入在文本框中输入mail。
然后StartSSL请你核对好信息,其中Common Name要与之前的二级域名一致。没有错误的话点击Continue。
最后,我们就得到了一个CA证书!证书内容在文本框中,把文本框中的所有内容复制到一个文件中保存在服务器上。你可以为CA证书文件起名为mydomain.com.crt,比如我的是linuxbabe.com.crt。
创建一个完整的证书链
CA证书是用来证明你的服务器是经过CA机构认证的。那么怎么来认证这些CA机构呢?怎么才能让浏览器信任这个CA机构呢?CA机构分为两类,一类是Root CA,另一类是中介CA。如果给你签发证书的机构是一个Root CA,那么现在证书链已经创建好了,因为浏览器中内置了Root CA名单,这些Root CA都是受浏览器信任的。但如果你的CA证书是由中介CA签发的话,那么我们还需要取得Root CA对中介CA签发的中介CA证书。
因为我们从StartSSL取得的免费CA证书是由StartSSL中介CA签发的。所以我们现在需要取得StartSSL的中介CA证书。在服务器上输入下面的命令以下载StartSSL的中介CA证书。
wget https://www.startssl.com/certs/class1/sha2/pem/sub.class1.server.sha2.ca.pem
然后,将你的CA证书和StartSSL的中介CA证书合并在一个文件中,输入下面的命令:
cat mydomain.com.crt sub.class1.server.sha2.ca.pem > unified.crt
当浏览器查看unified.crt证书文件时,首先看到的是StartSSL给你签发的免费CA证书,然后往下看到Root CA给StartSLL签发的中介CA证书。这两个证书与浏览器内置的Root CA名单形成了一个完整的证书链。
将证书安装在自己的web服务器上
首先来讲Nginx Web服务器如何启用SSL/TLS并安装证书
将经过解密的私钥复制到/etc/ssl/private/目录下:
sudo cp my-private-decrypted.key /etc/ssl/private/
将合成的证书文件复制到/etc/ssl/certs/目录下:
sudo cp unified.crt /etc/ssl/certs/
然后编辑Nginx配置文件
sudo vi /etc/nignx/sites-enabled/default
作如下修改,301重定向将使所有HTTP请求转成HTTPS。
server { listen 80; server_name linuxbabe.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name linuxbabe.com; ssl_certificate /etc/ssl/certs/unified.crt; ssl_certificate_key /etc/ssl/private/my-private-decrypted.key; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; location / { try_files $uri $uri/ /index.php; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/html; } location ~ \.php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
保存文件后,输入下面的命令测试Nginx的配置是否正确:
sudo nginx -t
然后重启Nginx:
sudo service nginx restart 或 sudo systemctl restart nginx
nginx: [emerg] listen() to 0.0.0.0:80, backlog 511 failed (98: Address already in use)
那么执行下面的命令,fuser会找到并杀死使用80端口的进程。
sudo fuser -k 80/tcp
然后再重启Nginx。
现在浏览器连接到你的网站时,会出现一把绿锁。
邮件服务器如何安装CA证书
Postfix安装证书
打开/etc/postfix/main.cf文件
sudo vi /etc/postfix/main.cf
在# TLS parameters下面添加如下内容:
smtpd_tls_cert_file=/etc/ssl/certs/unified.crt smtpd_tls_key_file=/etc/ssl/private/my-private-decrypted.key smtpd_use_tls=yes smtpd_tls_security_level=may smtpd_tls_protocols = !SSLv2, !SSLv3
Dovecot安装证书
打开/etc/dovecot/dovecot.conf文件
sudo vi /etc/dovecot/dovecot.conf
在文件中添加如下内容:
ssl=required ssl_cert = </etc/ssl/certs/unified.crt ssl_key = </etc/ssl/private/my-private-decrypted.key
备份你的私钥和证书
最后,不要忘记备份你经过加密的私钥和CA证书。私钥的密码也要记下来。给自己设置一个定期提醒,在证书失效之前提醒自己重新申请证书。(我使用QQ邮箱的定时发送邮件功能。)
我们还要在浏览器中导出StartSSL网站的身份证书以备份,这个证书就相当于我们的身份证,用来登录StartSSL网站。
非常感谢,资料非常详细。我已经成功部署。
需要注意的是我用的 LNMP 一键安装包,配置 nginx 配置文件时路径可能不一样。