Nginx配置SSL自签名证书的方法


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;
}

文章作者: darebeat
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 darebeat !
  目录