免費(fèi)SSL安全證書Let's Encrypt安裝使用教程(附Nginx/Apache配置)
Let's Encrypt是最近很火的一個(gè)免費(fèi)SSL證書發(fā)行項(xiàng)目,Let's Encrypt是由ISRG提供的免費(fèi)免費(fèi)公益項(xiàng)目,自動(dòng)化發(fā)行證書,但是證書只有90天的有效期。適合個(gè)人使用或者臨時(shí)使用,不用再忍受自簽發(fā)證書不受瀏覽器信賴的提示。前段時(shí)間一直是內(nèi)測(cè),現(xiàn)在已經(jīng)開放了。本教程安裝不需要停掉當(dāng)前Web服務(wù)(Nginx/Apache),直接生成證書,廢話不多說(shuō)下面開始:
目前已經(jīng)更新為新工具certbot,使用教程:http://www.0794baidu.com/build/letsencrypt-certbot.html 配置文件和以前一樣。
建議使用git 以后有了新版更新方便,沒安裝的話Debian/Ubuntu:apt-get install git ,CentOS:yum install git-core
git clone https://github.com/letsencrypt/letsencrypt.git
cd letsencrypt
不安裝git的話:wget -c?https://github.com/letsencrypt/letsencrypt/archive/master.zip && unzip?master.zip && cd?letsencrypt-master
LNMP一鍵安裝包都是Nginx/Apache默認(rèn)支持ssl不需要另外單獨(dú)編譯,接下來(lái)先以LNMP一鍵安裝包為例,LNMP用戶可以直接參考此教程(LNMP v1.4自帶此功能,可以直接使用lnmp ssl add (已經(jīng)添加過該域名) 或lnmp vhost add (未添加過該域名)添加,1.3及之前用戶可以升級(jí)到1.4,lnmp1.3升級(jí)1.4教程):
執(zhí)行:mkdir -p /home/wwwroot/域名/.well-known/acme-challenge 創(chuàng)建臨時(shí)目錄,當(dāng)然這個(gè).well-known/acme-challenge前面的目錄要替換為你自己的網(wǎng)站目錄,根據(jù)你自己的實(shí)際情況修改。
正式開始生成證書
接下來(lái)正式進(jìn)行證書生成操作:
./letsencrypt-auto certonly --email 郵箱 -d 域名 --webroot -w /網(wǎng)站目錄完整路徑 --agree-tos
如果多個(gè)域名可以加多個(gè)-d 域名,注意替換上面的郵箱、域名和網(wǎng)站目錄,注意這里的網(wǎng)站目錄完整路徑只是你單純的網(wǎng)站目錄也就是虛擬主機(jī)配置文件里的,如Nginx虛擬主機(jī)配置里的root,Apache虛擬主機(jī)配置里的DocumentRoot。
首先Let's Encrypt會(huì)檢測(cè)系統(tǒng)安裝一些依賴包,安裝完依賴包會(huì)有藍(lán)色的讓閱讀TOS的提示,Agree回車 稍等片刻就行了可添加--agree-tos參數(shù)屏蔽該窗口。
生成證書后會(huì)有如下提示:
IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to licess@vpser.net.
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/www.0794baidu.com/fullchain.pem. Your cert will
expire on 2016-03-07. To obtain a new version of the certificate in
the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Let's
Encrypt so making regular backups of this folder is ideal.
- If like Let's Encrypt, please consider supporting our work by:Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Nginx虛擬主機(jī)的設(shè)置
接下來(lái)進(jìn)行配置Nginx虛擬主機(jī)文件,LNMP模式下完整配置如下:
server
{
listen 443 ssl; ? #lnmp1.3+版本默認(rèn)支持http2,可以加上http2,lnmp1.2版本默認(rèn)支持spdy,可以加上spdy
server_name www.0794baidu.com; ? ? ##這里是你的域名
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/www.0794baidu.com; ? ? ? ? ? ?#網(wǎng)站目錄
ssl_certificate /etc/letsencrypt/live/www.0794baidu.com/fullchain.pem; ? ?#前面生成的證書,改一下里面的域名就行
ssl_certificate_key /etc/letsencrypt/live/www.0794baidu.com/privkey.pem; ? #前面生成的密鑰,改一下里面的域名就行
SSLCertificateChainFile /etc/letsencrypt/live/www.0794baidu.com/chain.pem; #Apache 2.2版本需要加入該中間證書,否則瀏覽器可能不信任
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;include wordpress.conf; ?#這個(gè)是偽靜態(tài)根據(jù)自己的需求改成其他或刪除
#error_page 404 /404.html;
location ~ [^/]\.php(/|$)
{
# comment try_files $uri =404; to enable pathinfo
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf; ? ? #lnmp 1.0及之前版本替換為include fcgi.conf;
#include pathinfo.conf;
}location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}location ~ .*\.(js|css)?$
{
expires 12h;
}access_log off;
}
需將上述配置根據(jù)自己的實(shí)際情況修改后,添加到虛擬主機(jī)配置文件最后面。
添加完需要執(zhí)行:/etc/init.d/nginx reload 重新載入配置使其生效。
不要輕易添加HSTS,如果需要HSTS,可以加上add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; 前面參數(shù)里的數(shù)值是秒。?開啟后有效期內(nèi)只能https訪問而且所有二級(jí)域名也都是強(qiáng)制https,不確定的話不要開啟。
LNMPA模式下只需要在Nginx上設(shè)置,只需要將location ~ [^/]\.php(/|$) { 到下一個(gè) } 的php解析部分替換為 include proxy-pass-php.conf; 即可。
Apache虛擬主機(jī)上的設(shè)置
LAMP模式按下面配置文件。Apache在生成證書后也需要修改一下apache的配置文件 /usr/local/apache/conf/httpd.conf ,查找httpd-ssl將前面的#去掉。
然后再執(zhí)行:
Apache 2.2如下:
cat >/usr/local/apache/conf/extra/httpd-ssl.conf<<EOF
Listen 443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLCipherSuite EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5
SSLProxyCipherSuite EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5
SSLHonorCipherOrder on
SSLProtocol all -SSLv2 -SSLv3
SSLProxyProtocol all -SSLv2 -SSLv3
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/usr/local/apache/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300
SSLMutex "file:/usr/local/apache/logs/ssl_mutex"
SSLStrictSNIVHostCheck on
NameVirtualHost *:443
EOF
Apache 2.4如下:
cat >/usr/local/apache/conf/extra/httpd-ssl.conf<<EOF
Listen 443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLCipherSuite EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5
SSLProxyCipherSuite EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5
SSLHonorCipherOrder on
SSLProtocol all -SSLv2 -SSLv3
SSLProxyProtocol all -SSLv2 -SSLv3
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/usr/local/apache/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300
Mutex sysvsem default
SSLStrictSNIVHostCheck on
EOF
并在對(duì)應(yīng)apache虛擬主機(jī)配置文件的最后</VirtualHost>下面添加上SSL部分的配置文件:
<VirtualHost *:443>
DocumentRoot /home/wwwroot/www.0794baidu.com ? #網(wǎng)站目錄
ServerName www.0794baidu.com:443 ? #域名
ServerAdmin licess@vpser.net ? ? ?#郵箱
ErrorLog "/home/wwwlogs/www.0794baidu.com-error_log" ? #錯(cuò)誤日志
CustomLog "/home/wwwlogs/www.0794baidu.com-access_log" common ? ?#訪問日志
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/www.0794baidu.com/fullchain.pem ? #改一下里面的域名就行
SSLCertificateKeyFile /etc/letsencrypt/live/www.0794baidu.com/privkey.pem ? ?#改一下里面的域名就行
<Directory "/home/wwwroot/www.0794baidu.com"> ? #網(wǎng)站目錄
SetOutputFilter DEFLATE
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
DirectoryIndex index.html index.php
</Directory>
</VirtualHost>
需將上述配置根據(jù)自己的實(shí)際情況修改后,添加到虛擬主機(jī)配置文件最后面。注意要重啟apache使其實(shí)現(xiàn)。執(zhí)行:/etc/init.d/httpd restart 重啟Apache使其生效。
下面說(shuō)一下可能會(huì)遇到的問題:
1、國(guó)內(nèi)DNS服務(wù)商可能會(huì)不行,目前已知dnspod、cloudxns不行dnspod、cloudxns目前已經(jīng)可以
Namecheap、Route 53的都可以。
2、Linode福利或IPv6用戶福利
可能目前Linode用戶應(yīng)該遇到了
An unexpected error occurred:
There were too many requests of a given type :: Error creating new registration :: Too many registrations from this IP
Please see the logfiles in /var/log/letsencrypt for more details.
這個(gè)不一定是因?yàn)镮P注冊(cè)的次數(shù)過多,可能是因?yàn)镮Pv6的事,具體解決方法如下:
執(zhí)行:sysctl -w net.ipv6.conf.all.disable_ipv6=1 來(lái)臨時(shí)禁用IPv6
再生成證書后執(zhí)行:sysctl -w net.ipv6.conf.all.disable_ipv6=0 再來(lái)解除禁用IPv6
3、如果啟用了防火墻需要將443端口加入允許規(guī)則,一般iptables可以參考:http://www.0794baidu.com/security/linux-iptables.html
4、如果LNMP下訪問http://abc.com/.well-known/acme-challenge/**** 這個(gè)鏈接403的話是因?yàn)槟J(rèn)LNMP 1.3的虛擬主機(jī)里是禁止.開頭的隱藏文件及目錄的。需要將
location ~ /\.
{
deny all;
}
這段配置刪掉或注釋掉或在這段配置前面加上
location ~ /.well-known {
allow all;
}
以上配置代碼,然后重啟nginx。
證書續(xù)期
最后要說(shuō)的是續(xù)期,因?yàn)樽C書只有90天,所以建議60左右的時(shí)候進(jìn)行一次續(xù)期,續(xù)期很簡(jiǎn)單可以交給crontab進(jìn)行完成,執(zhí)行:
cat >/root/renew-ssl.sh<<EOF
#!/bin/bash
mkdir -p /網(wǎng)站目錄完整路徑/.well-known/acme-challenge
/root/letsencrypt/letsencrypt-auto --renew-by-default certonly --email 郵箱 -d 域名 --webroot -w /網(wǎng)站目錄完整路徑 --agree-tos
/etc/init.d/nginx reload
EOF
chmod +x /root/renew-ssl.sh
注意要修改上面letsencrypt-auto的路徑為你自己的,并且里面的郵箱和域名也要修改。
再crontab里添加上:0 3 */60 * * /root/renew-ssl.sh?具體crontab教程點(diǎn)擊查看
2015.12.13更新
官網(wǎng)更新了參數(shù),對(duì)本文進(jìn)行了部分參數(shù)的調(diào)整。原-a webroot --webroot-path=/網(wǎng)站目錄完整路徑替換為--webroot -w;--renew替換為--renew-by-default;增加--agree-tos參數(shù)。
同時(shí)這里提醒一下如果設(shè)置了http 301跳到https的用戶,再續(xù)期前還需要在nginx設(shè)置如下:
80端口的虛擬主機(jī)上需要添加上,不加的話會(huì)無(wú)法驗(yàn)證的
location /.well-known/ {
add_header Content-Type 'text/plain;';
root /網(wǎng)站目錄完整路徑;
}
附完整的nginx下301 http跳到https的配置:
server
{
listen 80;
server_name www.0794baidu.com;
location /.well-known/ {
add_header Content-Type 'text/plain;';
root /網(wǎng)站目錄完整路徑;
}
location / {
return 301 http://www.0794baidu.com$request_uri;
}
}
目前就先說(shuō)這些,有問題可以在本文章下部留言或到VPS論壇發(fā)帖。
VPS偵探論壇邀請(qǐng)碼:https://bbs.vpser.net/reg.php?invitecode=4957327b6f7rDwOe ?有效期至:2015-12-13 14:34
>>轉(zhuǎn)載請(qǐng)注明出處:VPS偵探 本文鏈接地址:http://www.0794baidu.com/build/letsencrypt-free-ssl.html











LNMPA環(huán)境好像不支持Nginx和Apache都開SSL
@xiaolu, 你是lnmpa肯定沒php-fpm,ssl的虛擬主機(jī)除ssl配置部分外其他配置參考你的http的配置文件
接上一條補(bǔ)充:http 形式訪問網(wǎng)站的頁(yè)面可以正常訪問,https 形式訪問網(wǎng)站的頁(yè)面才出現(xiàn) 502 Bad Gateway,但是用 https 形式訪問網(wǎng)站頁(yè)面里的單張圖片可以正常訪問 。
網(wǎng)站程序用的wordpress,沒有開啟緩存,里面所有 http://域名 的地方全部修改為 https://域名 的形式了。請(qǐng)問,我的問題出現(xiàn)在什么地方?
軍哥,我是lnmpa模式,按照上面的步驟只配置了nginx的ssl,重啟以后網(wǎng)站出現(xiàn) 502 Bad Gateway,查看了日志(/home/wwwlogs/nginx_error.log),提示 [crit] 13890#0: *1 connect() to unix:/tmp/php-cgi.sock failed (2: No such file or directory) while connecting to upstream, client...server...request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-cgi.sock:", host...
然后,我把 fastcgi_pass unix:/tmp/php-cgi.sock; 改成 fastcgi_pass 127.0.0.1:9000; 重啟nginx服務(wù),還是出現(xiàn) 502 Bad Gateway,還在日志(/usr/local/nginx/logs/error.log)里看到了如下信息,[notice] 16303#0: signal process started
是我的一鍵安裝包里的 php-fpm 服務(wù)有問題的原因嗎?
軍哥,您好,lnmpa模式下只在nginx上設(shè)置ssl就可以了,不需要在apache下再配置ssl,是嗎?
@小路, 你這個(gè)估計(jì)不是apache 2.4版本,mutex模塊是默認(rèn)自編譯上去的,而且自有l(wèi)nmpa模式開始就沒有使用該2.4.6這個(gè)版本的apache,你可以看一下apache的錯(cuò)誤日志,lnmpa模式下在apache上設(shè)ssl就成lamp模式了
軍哥,我在 /usr/local/nginx/conf/vhost 里配置了nginx部分的ssl,重啟了沒問題。我用的lnmpa模式,只配置nginx沒正常工作,然后又按照下面的apache的步驟配置了一遍,重啟以后提示 Invalid command 'Mutex', 是不是我的apache里缺少什么模塊?
@小路, lnmpa模式下是需要在nginx上設(shè)置ssl
軍哥,感謝您的教程。我用的您的lnamp一鍵安裝包,Apache/2.4.6 (CentOS),配置以后,重啟apache的時(shí)候,提示 stop apache... Syntax error on line 17 of /usr/local/apache/conf/extra/httpd-ssl.conf:
Invalid command 'Mutex', perhaps misspelled or defined by a module not included in the server configuration
failed
請(qǐng)問如何解決?
@小馬運(yùn)維, letsencrypt都是用的pem,linux上不按文件名來(lái)確定文件類型,你就是到目錄里改成 fullchain.hahha 只要nginx配置文件中也是這個(gè)一樣正常工作
軍哥,首先感謝您的教程在學(xué)習(xí)中看到"ssl_certificate /etc/letsencrypt/live/www.0794baidu.com/fullchain.pem; #前面生成的證書,改一下里面的域名就行,不建議更換路徑
ssl_certificate_key /etc/letsencrypt/live/www.0794baidu.com/privkey.pem; #前面生成的密鑰,改一下里面的域名就行,不建議更換路徑"這個(gè)其中是不是應(yīng)該一個(gè)是pem一個(gè)是key文件,如果是上面的配置有錯(cuò),更改一下!
@solgh, 上面有提示,你改過DocumentRoot參數(shù),提示的目錄不存在。其次 lsof -i:443看一下現(xiàn)在是什么程序在占用443端口
@solgh, 全站訪問出現(xiàn) 502 Bad Gateway
[root@root /]# /etc/init.d/httpd restart
restart apache... Warning: DocumentRoot [/usr/local/apache/lnmp] does not exist
httpd not running, trying to start
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:443
no listening sockets available, shutting down
Unable to open logs
failed
[root@root/]#
軍哥 , 按照你的教程,配置到最后 Apache 重啟出錯(cuò)了,請(qǐng)問問題在哪?
@Spectrum, 沒80的server是不行的,需要通過80的該域名的虛擬機(jī)進(jìn)行文件驗(yàn)證
軍哥,按照你的教程,配置如下但無(wú)法通過驗(yàn)證,請(qǐng)問問題在哪里?
此外這個(gè)語(yǔ)句加到配置文件什么位置:
如果需要HSTS,可以加上add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; 開啟后有效期內(nèi)必須只能https訪問,不確定的話不要開啟。
配置文件如下且只有下面443端口無(wú)80:
server
{
listen 443 ssl;
server_name xxx.com;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/default;
ssl_certificate /etc/letsencrypt/live/xxx.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xxx.com/privkey.pem;
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
#error_page 404 /404.html;
location ~ [^/]\.php(/|$)
{
# comment try_files $uri =404; to enable pathinfo
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
#include pathinfo.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
access_log off;
}