nginx配置https

Nov 5, 2020


前言

本文主要记录如何将nginx配置为https反向代理

自签名证书

在配置https之前,我们需要先准备好证书文件,nginx需要两个证书文件:pem和key。

如果你已经有申请好的根证书,则忽略本步骤,如果没有证书,需要自签名,则按照本步骤生成自己的证书。

这里生成证书使用的是openssl和jdk中的keytool,如果没有请先自行安装这两个工具。

生成证书库

$> keytool -genkey -alias nginx -keyalg RSA -keystore nginx.jks
输入密钥库口令:  
再次输入新口令: 
您的名字与姓氏是什么?
  [Unknown]:  127.0.0.1
您的组织单位名称是什么?
  [Unknown]:  bingo 
您的组织名称是什么?
  [Unknown]:  bingo
您所在的城市或区域名称是什么?
  [Unknown]:  gz
您所在的省/市/自治区名称是什么?
  [Unknown]:  gd
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=127.0.0.1, OU=bingo, O=bingo, L=gz, ST=gd, C=cn是否正确?
  [否]:  y

输入 <nginx> 的密钥口令
	(如果和密钥库口令相同, 按回车):  
再次输入新口令: 

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore nginx.jks -destkeystore nginx.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

说明: 这里所有输入密钥的地方,全部以changeit为例。 需要注意的是,由于证书和域名是绑定的,因此您的名字与姓氏是什么?这里,需要输入nginx的访问域名或者ip地址,其他值随意。

上面的步骤执行完成之后,在当前目录会生成一个证书库文件nginx.jks,接下来从这个证书库中提取证书文件:

首先转换证书格式为p12:

$> keytool -importkeystore -srckeystore nginx.jks -destkeystore nginx.p12 -srcalias nginx -srcstoretype jks -deststoretype pkcs12
正在将密钥库 nginx.jks 导入到 nginx.p12...
输入目标密钥库口令:  
再次输入新口令: 
输入源密钥库口令:  

三次口令全部输入changeit

得到p12证书文件。

将p12证书文件转换为pem文件:

$> openssl pkcs12 -in nginx.p12 -out nginx.pem
Enter Import Password:
MAC verified OK
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

三次口令全部输入changeit

从pem文件提取key文件:

$> openssl rsa -in nginx.pem -out nginx.key
Enter pass phrase for nginx.pem:
writing RSA key

口令输入changeit

到这里我们就得到nginx.pemnginx.key文件了。

配置证书

这里以nginx 1.14为例。

/etc/nginx/nginx.conf中,包含如下配置:

http {
    ## ...
	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

这里表示加载/etc/nginx/conf.d目录和/etc/nginx/sites-enabled/目录的配置,在/etc/nginx/sites-enabled/目录下,default配置了默认的80端口服务,如果不需要,建议删除default配置文件。

/etc/nginx/conf.d增加配置文件server.conf:

server {
	listen 8443 ssl;
	ssl_certificate /etc/nginx/conf.d/cert/nginx.pem; # pem证书文件位置
	ssl_certificate_key /etc/nginx/conf.d/cert/nginx.key; # key证书文件位置

	server_name 127.0.0.1; # 服务名,注意和证书申请的`您的名字与姓氏是什么?`保持一致
	location /iamsso {
		proxy_pass http://127.0.0.1:8089/iamsso;
	}
	location /iamapi {
		proxy_pass http://127.0.0.1:8087/iamapi;
	}
}

如上配置,即可实现如下转发:

https://127.0.0.1:8443/iamsso -> http://127.0.0.1:8089/iamsso
https://127.0.0.1:8443/iamapi -> http://127.0.0.1:8087/iamapi