SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。 TLS与SSL在传输层对网络连接进行加密。
使用这种技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外部各方拦截。证书系统还可以帮助用户验证他们正在连接的站点的身份。
在本文中,通过自生成和设置自签名SSL证书,以便与服务器上的Nginx Web服务器一起使用。
注意:自签名证书会加密服务器与任何客户端之间的通信。但是,由于Web浏览器没有包含任何受信任的证书颁发机构,因此用户无法使用该证书自动验证服务器的身份。
生成自签名SSL证书
- 生成RSA密钥(过程需要设置一个密码,记住这个密码)
DOMAIN=www.darebeat.cn
openssl genrsa -des3 -out $DOMAIN.origin.key 1024
- 拷贝一个不需要输入密码的密钥文件
openssl rsa -in $DOMAIN.origin.key -out $DOMAIN.key
- 生成一个证书请求
openssl req -new -key $DOMAIN.origin.key -out $DOMAIN.csr
输入完这些就会生成一个$$DOMAIN.csr
文件,提交给ssl提供商的时候就是这个csr文件,当然这里并没有向任何证书提供商申请,而是自己签发证书.
- 使用上面的密钥和CSR对证书签名
openssl x509 -req -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt
一键生成脚本
cat > gencert.sh << EOF
#!/bin/sh
# create self-signed server certificate:
read -p "Enter your domain [www.example.cn]: " DOMAIN
echo "Create \$DOMAIN server key..."
openssl genrsa -des3 -out \$DOMAIN.key 1024
echo "Create server certificate signing request..."
# C是Country、ST是state、L是localcity、O是Organization、OU是Organization Unit、CN是common name等
SUBJECT="/C=CN/ST=China/L=GuiYang/O=\$DOMAIN/OU=\$DOMAIN/CN=\$DOMAIN"
openssl req -new -subj \$SUBJECT -key \$DOMAIN.key -out \$DOMAIN.csr
echo "Remove password..."
mv \$DOMAIN.key \$DOMAIN.origin.key
openssl rsa -in \$DOMAIN.origin.key -out \$DOMAIN.key
echo "Sign SSL certificate..."
openssl x509 -req -days 3650 -in \$DOMAIN.csr -signkey \$DOMAIN.key -out \$DOMAIN.crt
echo "TODO:"
echo "Copy \$DOMAIN.crt to /etc/nginx/ssl/\$DOMAIN.crt"
echo "Copy \$DOMAIN.key to /etc/nginx/ssl/\$DOMAIN.key"
echo "Add configuration in nginx:"
echo "server {"
echo " ..."
echo " listen 443 ssl;"
echo " ssl_certificate /etc/nginx/ssl/\$DOMAIN.crt;"
echo " ssl_certificate_key /etc/nginx/ssl/\$DOMAIN.key;"
echo "}"
EOF
bash +x gencert.sh
# 输入相同的密码几次即可生成如下口令和证书
# www.darebeat.cn.crt 自签名的证书
# www.darebeat.cn.csr 证书的请求
# www.darebeat.cn.key 不带口令的Key
# www.darebeat.cn.origin.key 带口令的Key
nginx 配置
server {
# 监听80端口,强制转到443端口,进行https访问
listen 80;
server_name darebeat.cn;
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
listen 443 ssl;
#强制使用https访问
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;preload" always;
... # 此处省略其它配置内容
ssl on;
ssl_certificate /etc/nginx/ssl/www.darebeat.cn.crt; #证书格式有多种,常见的有pem、cer等
ssl_certificate_key /etc/nginx/ssl/www.darebeat.cn.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
}