本地生成证书
在当前文件夹生成ssl证书(相关参数自己调整)
注意:ssl证书的位置要和nginx配置文件的位置要在同一文件夹下 建议在/usr/local/nginx/conf文件夹下创建cert文件夹来存放
bash`openssl req -x509 -newkey rsa:4096 -keyout ssl.key -out ssl.crt -days 365`
参数 | 说明 |
---|---|
openssl req | 这是OpenSSL的请求模块,用于创建和处理证书请求。 |
-x509 | 这个选项告诉OpenSSL我们不是创建一个证书请求,而是直接创建一个自签名的X.509证书。 |
-newkey rsa:4096 | 这会生成一个新的4096位的RSA私钥。 |
-keyout ssl.key | 这指定了将生成的私钥保存到ssl.key文件。 |
-out ssl.crt | 这指定了将生成的证书保存到ssl.crt文件。 |
-days 365 | 这设置了证书的有效期为365天。 |
配置ssl证书参数
Enter PEM pass phrase: // 自定义输入PEM密码
Verifying - Enter PEM pass phrase: // 确认密码
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN // 所在国家简称
State or Province Name (full name) [Some-State]:shagnhai // 所在省市简称
Locality Name (eg, city) []:shanghai // 所在城市简称
Organization Name (eg, company) [Internet Widgits Pty Ltd]:baidu // 公司简称
Organizational Unit Name (eg, section) []:leader // 职位简称
Common Name (e.g. server FQDN or YOUR name) []:wxl // 用户名称
Email Address []:xxxxxxxxxxxx@qq.com // 用户邮箱
执行命令后在当前文件夹生成ssl.crt和ssl.key
nginx配置
安装模块
因为有用到nginx的https模块,先查看当前nginx是否已经添加。打开/usr/local/nginx/sbin/执行命令
nginx -V
查看configure是否已经加载–with-http_stub_status_module --with-http_ssl_module这两个模块
nginx version: nginx/1.25.2
built by gcc 7.3.0 (GCC)
built with OpenSSL 1.1.1f 31 Mar 2020
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-stream
如果没有就需要重新编译。
打开nginx的源码目录,注意是源码目录/usr/local/nginx-1.25.2/ 执行命令
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
注意 如果之前configure arguments已经安装过其他模块,这次需要一起加上不然会覆盖掉,比如我之前已经安装过了stream模块
./configure --prefix=/usr/local/nginx --with-stream --with-http_stub_status_module --with-http_ssl_module
make
不要执行make install不然会覆盖掉之前的配置
1,备份nginx文件
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
2,覆盖nginx文件
执行成功以后会在源码目录下的objs中生成一个nginx可执行文件
cp /usr/local/nginx-1.25.2/objs/nginx /usr/local/nginx/sbin/
3,重启nginx服务
systemctl restart nginx
4,再次进入 /usr/local/nginx/sbin/目录 执行nginx -V查看
nginx version: nginx/1.25.2
built by gcc 7.3.0 (GCC)
built with OpenSSL 1.1.1f 31 Mar 2020
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-stream --with-http_stub_status_module --with-http_ssl_module
配置服务
打开nginx.conf文件添加相关配置
server {
listen 80;
server_name localhost; # 替换为你的域名或IP地址
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl; # HTTP到HTTPS的重定向端口
server_name localhost; # 替换为你的域名或IP地址
ssl_certificate cert/ssl.crt; # 替换为你的证书文件的路径
ssl_certificate_key cert/ssl.key; # 替换为你的私钥文件的路径
# 定义了Nginx支持的SSL/TLS协议版本
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 定义了Nginx支持的加密套件列表
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
# 这意味着在客户端和服务器之间协商SSL/TLS连接时,Nginx会优先选择服务器提供的加密套件,而不是客户端提供的
ssl_prefer_server_ciphers on;
}
如果你用的不是80端口 则可以在一个server里面配置
server {
listen 8010 ssl; # HTTP到HTTPS的重定向端口
server_name localhost; # 替换为你的域名或IP地址
ssl_certificate cert/ssl.crt; # 替换为你的证书文件的路径
ssl_certificate_key cert/ssl.key; # 替换为你的私钥文件的路径
...
}
配置完成后重启nginx服务
systemctl restart nginx
测试相关接口或者配置
curl -k https://xxxxx
其他问题
nginx: [emerg] cannot load certificate key "/usr/local/nginx/conf/cert/ssl.key": PEM_read_bio_PrivateKey() failed (SSL: error:2807106B:UI
这个问题是每次执行ssl.key文件的时候都要输入密码,密码就是我们上面创建ssl证书的时候输入的密码,所以我们要进行免密操作
// 进入ssl目录 /usr/local/nginx/conf/cert/
cp ssl.key ssl.key.org
openssl rsa -in ssl.key.org -out ssl.key