Let's Encrypt 免费 SSL 证书生成脚本。
在 Mac 和 Ubuntu 上试过 shell 脚本。Win 上没试过不知道能不能,如果不能可能是有些脚本命令不兼容吧。
Python 脚本还没试过。
Let's Encrypt
生成的证书只有90天有效期。
目录下 multissl.sh
和 singlessl.sh
是多域名shell脚本和单域名shell脚本。python脚本是根据这两个的方案写的。
若首次运行,会自动生成 account.key
(你的账号key), domain.key
(域名key), domain.csr
(使用域名key和域名列表生成的域名csr), intermediate.pem
(Let's Encrypt的中间证书) 文件,保留以上这些文件可以复用于下次更新证书。
- 编写
domains
文件,每行输入一个域名。 - 配置服务端环境,使得能够访问
http://a.com/.well-known/acme-challenge/
和http://b.com/.well-known/acme-challenge/
来获得本目录下的文件。用于Let's Encrypt
验证域名是否属于你。 - 在本目录下运行
python letsencrypt.py --domains ./domains
。若原本已经有了a.com
和b.com
生成的domain.csr
在本目录下,可以通过增加参数--update
来只进行更新证书操作。(PS:更新证书即是使用原本的account.key
和domain.csr
重新生成新证书) signed.cert
是未整合Let's Encrypt
中间证书前的证书。生成的chained.pem
就是最终的整合了Let's Encrypt
中间证书的最终证书。一般我们使用的是chained.pem
。- 配置服务端环境的证书key为
domain.key
,证书为chained.pem
。
- 配置服务端环境,使得能够访问
http://a.com/.well-known/acme-challenge/
和http://b.com/.well-known/acme-challenge/
来获得本目录下的文件。用于Let's Encrypt
验证域名是否属于你。 - 因为是多域名,选择使用
multissl.sh
- 修改
multissl.sh
中 domaincn 的值为你的域名,如下:domaincn="[SAN]\nsubjectAltName=DNS:a.com,DNS:b.com"
- MAC 下,先运行
chmod -x ./multissl.sh
设置权限 - 运行
./multissl.sh
,生成account.key
,domain.key
,signed.cert
,chained.pem
等文件。 signed.cert
是未整合Let's Encrypt
中间证书前的证书。生成的chained.pem
就是最终的整合了Let's Encrypt
中间证书的最终证书。一般我们使用的是chained.pem
。- 配置服务端环境的证书key为
domain.key
,证书为chained.pem
。
API_BASE_URL
替换成你的域名,多域名以空格分开。如 a.com b.com
。
location /.well-known/acme-challenge/
下的 alias
是本目录所在位置。
server {
listen 80;
server_name API_BASE_URL;
root /usr/share/nginx/node/public;
index index.html;
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/x-javascript application/javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
# Proxy To Backend
location /api {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:8000;
proxy_redirect default;
}
location /v0 {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:8000;
proxy_redirect default;
}
location / {
try_files $uri $uri/ /index.html =404;
}
location /.well-known/acme-challenge/ {
alias /etc/nginx/ssl/;
try_files $uri =404;
}
}
server_names_hash_bucket_size 128;
client_max_body_size 16M;
在证书生成完成后配置,配置完可能需要重启 nginx, 运行 service nginx reload
。
server {
listen 443 ssl;
server_name API_BASE_URL;
ssl_certificate /etc/nginx/ssl/chained.pem;
ssl_certificate_key /etc/nginx/ssl/domain.key;
root /usr/share/nginx/node/public;
index index.html;
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/x-javascript application/javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
# Proxy To Backend
location / {
proxy_pass http://127.0.0.1:8000/;
}
}