Featured image of post nginx反向代理后端双向认证应用的实践

nginx反向代理后端双向认证应用的实践

搭建测试环境

生成服务端和客户端证书

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 生成服务器证书,有效时间10年、证书别名为serverkey、生成文件名为server.keystore:
$ keytool -genkey -v -alias serverkey -keyalg RSA -keystore server.keystore -validity 3650

# 生成客户端证书,有效时间10年、证书别名为clientkey 、生成文件名为client.p12:
$ keytool -genkey -v -alias clientkey -keyalg RSA -storetype PKCS12 -keystore client.p12 -validity 3650

# 根据客户端证书(证书别名是clientkey、文件为client.p12)生成客户端p12证书信任文件,生成文件名为client.cer、密码为123456:
$ keytool -export -alias clientkey -keystore client.p12 -storetype PKCS12 -storepass 123456 -rfc -file client.cer

# 将信任证书导入到服务器server.keystore中:
keytool -import -v -file client.cer -keystore server.keystore

配置Tomcat

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<!-- 配置tomcat 启用https双向认证-->
	<Connector port="8443" 
		protocol="HTTP/1.1" 
		SSLEnabled="true" 
		maxThreads="150" 
		scheme="https" 
		secure="true" 
		clientAuth="true" 
		sslProtocol="TLS" 
		keystoreFile="F:\Download\geosmarter-dup-v6.1-x86_64\jre\jre_windows\bin\server.keystore" 
		keystorePass="123456" 
		truststoreFile="F:\Download\geosmarter-dup-v6.1-x86_64\jre\jre_windows\bin\server.keystore"
		truststorePass="123456" />

浏览器测试

导入证书到浏览器

步骤省略。。。

访问应用

浏览器会弹窗让选择对应的证书,选了就可以访问了

Nginx代理配置

1
2
3
# Nginx不支持p12格式证书,把p12转成pem格式,openssl环境自己解决
$ openssl pkcs12 -in client.p12 -out client.pem -nodes
$ openssl pkcs12 -nocerts -in client.p12 -out client.key -nodes
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# nginx增加如下配置
# nginx 本身的协议不关键,我试过了,nginx代理之后走http也是可以访问的。
location **** {
	# ...
	proxy_ssl_certificate /usr/local/openresty/nginx/key/client.pem;
	proxy_ssl_certificate_key /usr/local/openresty/nginx/key/client.key;
	proxy_ssl_server_name on;
	# proxy_pass https://xxxxxx.com/;
	# ...
}

启动nginx就可以直接访问了,不需要指定证书。