本文将介绍nginx站点多域名启动ssl的方法,如何在不影响已部署ssl的情况下为当前站点重新部署新域名ssl,以及检查证书和密钥是否匹配等问题
问题描述
当一个站点同时添加了多个域名后且需要同时开启ssl时,可为多个域名同时申请公用证书直接部署即可。
如果站点已经开启了ssl,后续增加新域名也要求开启ssl时:
解决方法有两种:
-
重新为所有域名申请公用证书,重新部署
此种方法优点是所有证书到期时间一致,缺点是已经开启的域名需要重新部署,中间会中断ssl
-
单独为新域名部署nginx server模块
此种方法优点是不会影响其他已部署域名,缺点是域名证书到期时间不一致
具体实现
-
重新为所有域名申请公用证书,重新部署
直接在宝塔面板中关闭ssl,再选择所有域名重新申请ssl部署即可
-
单独为新域名部署nginx server模块
以下为在宝塔面板下演示,其他nginx环境对应修改即可,新加域名为'imiseo.com'
首先单独为域名imiseo.com申请域名证书并保存
在
/www/server/panel/vhost/nginx
下新建后缀为.conf
的配置文件,具体内容可参考当前目录下其他配置文件,新建的配置文件名例如imiseo.com.conf
# 只展示主要内容,其他内容参考/www/server/panel/vhost/nginx/下的配置文件 server { listen 80; listen 443 ssl http2; server_name imiseo.com; index index.php index.html index.htm default.php default.htm default.html; root /www/wwwroot/common.io/public; #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则 #error_page 404/404.html; # 证书路径 ssl_certificate /www/server/panel/vhost/cert/imiseo.com/fullchain.pem; ssl_certificate_key /www/server/panel/vhost/cert/imiseo.com/privkey.pem; # SSL其他配置无须修改 ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Strict-Transport-Security "max-age=31536000"; error_page 497 https://$host$request_uri; #SSL-END #ERROR-PAGE-START 错误页配置,可以注释、删除或修改 #error_page 404 /404.html; #error_page 502 /502.html; #ERROR-PAGE-END # 其他部分省略 }
检查证书和密钥是否匹配
为防止配置的证书有误,可先进行证书检查
# 使用openssl命令工具 fullchain.pem为证书文件,privkey.pem为密钥文件 可相应替换
openssl x509 -noout -modulus -in ./fullchain.pem | openssl md5
openssl rsa -noout -modulus -in ./privkey.pem | openssl md5
如果证书和密钥匹配,则您将看到两个输出具有相同的md5散列值。如果不匹配,则您将看到两个输出具有不同的md5散列值
如何判断证书和域名是否匹配
# 使用以下命令获取证书的详细信息
openssl x509 -in /fullchain.pem -text -noout
- 此命令可显示证书的详细信息,其中包括“Subject”字段。该字段应包含与您的域名匹配的常规名称(CN)或替代名称(SAN)。
- 确认证书的CN或SAN字段与您的域名匹配。例如,域名是imiseo.com,则您的证书应具有CN或SAN字段包含“imiseo.com”作为其中一个值。
使用以下命令检查指定证书是否过期
openssl x509 -in ./fullchain.pem -noout -checkend 86400
使用PHP OpenSSL扩展检查域名证书是否匹配
<?php
// 指定证书和密钥的文件路径
$certFile = "/path/to/certificate.crt";
$keyFile = "/path/to/private.key";
// 读取证书和密钥的内容
$cert = file_get_contents($certFile);
$key = file_get_contents($keyFile);
// 将证书和密钥加载到OpenSSL中
$certResource = openssl_x509_read($cert);
$keyResource = openssl_get_privatekey($key);
// 检查证书和密钥是否匹配
if (openssl_x509_check_private_key($certResource, $keyResource)) {
echo "证书和密钥匹配\n";
} else {
echo "证书和密钥不匹配\n";
}
// 释放OpenSSL资源
openssl_x509_free($certResource);
openssl_free_key($keyResource);
?>
目前评论:0