前言
今天突然想到有一个项目的 bug, 好像是因为 https 协议造成的,所以就试着在本机上配置 nginx 的 https, 所以就开始搞了。因为之前了解过 https 需要证书,所以第一个问题就是解决证书从哪里获得,经过各种摸索,发现 OpenSSL 可以生成自签名的证书。第二个问题就是 nginx 的项目配置文件该怎么写。于是就查阅了 nginx 的官方文档, 于是问题就迎刃而解了。
实验环境
系统:windows 10
虚拟容器:docker
实现步骤
- 使用 OpenSSL 生成证书和密钥
创建密钥
openssl genrsa -des3 -out server.key 2048 # 使用 openssl 工具生成一个 RSA 私钥
生成证书签名请求(csr)
openssl req -new -key server.key -out server.csr # 需要依次输入国家,地区,城市,组织,组织单位,Common Name和Email。其中Common Name,可以写自己的名字或者域名,如果要支持https,Common Name应该与域名保持一致,否则会引起浏览器警告。
删除密钥中的密码
openssl rsa -in server.key -out server.key #如果不删除密码,在应用加载的时候会出现输入密码进行验证的情况,不方便自动化部署
生成自签名证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt # 内部或者测试使用,只要忽略证书提醒就可以了。
生成pem格式的公钥
openssl x509 -in server.crt -out server.pem -outform PEM # 有些服务,需要有pem格式的证书才能正常加载,可以用下面的命令:
总结
自签名的证书,不被浏览器信任,适合内部或者测试使用。生产环境请大家积极去购买 - 编写 nginx 中项目的配置文件
server { listen 8091 ssl; listen [::]:8091 ssl; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; ssl_certificate /usr/local/server.pem; ssl_certificate_key /usr/local/server.key; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1.2; ssl_prefer_server_ciphers on; # location / { # root /usr/share/nginx/html; # index index.html index.htm; # } location / { root /usr/local/dist; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} }
- 重新加载 nginx 的资源
nginx -s reload