# 2way-auth **Repository Path**: uchiyou/2way-auth ## Basic Information - **Project Name**: 2way-auth - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-10-02 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 2way-auth #### 介绍 和单向认证的差别 : a) 握手过程: 双向认证不仅需要客户端验证服务端的证书,服务端也需要验证客户端的证书。 b) 应用场景: 双向认证常用于客户数量较少且不对外开放的 ToB 场景 使用 httpclitn 4 实现 TLS 双向认证, 其中 证书使用的是通过 java keytool 生成自签名的证书,用于内部或私有环境。 #### 项目结构 1. 服务端开始双向认证: server.ssl.enabled : true , server.ssl.client-auth : true 2. HttpsUtil 是双向认证的客户端,本项目中为了简单,使用了和服务端相同的 keystore #### 使用说明 1. 先使用 java 的 keytool 生成相关的 私钥,然后导出相关证书 a) 一次性生成密钥库:keytool -genkeypair -alias serverkey -keypass 111111 -storepass 111111 -dname "C=CN,ST=GD,L=SZ,O=vihoo,OU=dev,CN=vihoo.com" -keyalg RSA -keysize 2048 -validity 3650 -keystore server.keystore b) 证书的导出:keytool -export -alias yushan -keystore e:/yushan.keystore -file e:/yushan.crt(指定导出的证书位置及证书名称) -storepass 123456 2. 客户端和服务端相互交换证书,并将对方的证书导入到自己的 keystore 中 c) 导入证书:keytool -import -file /path/xxx.cer -storepass xxx -keystore /path/cert.keystore -alias xxx keytool 操作参考: https://blog.csdn.net/liaomin416100569/article/details/76020675 ,https://blog.csdn.net/tony1130/article/details/5134318 #### 注意事项 1. 每次往秘钥库 keystore 里导入新的证书时,都需要重启客户端或服务端 2. SSL 系列的协议基本废弃了,客户端和服务端尽量使用 TLS, SSLContext.getInstance(SSLConnectionSocketFactory.TLS); 3. 生产环境双向认证一般是需要验证域名的,项目中为了测试跳过了域名验证。生产环境需要去掉 register("https", new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE)).build() 4. 可以使用wireshark 或 设置 System.setProperty("javax.net.debug", "all") 来查看 TLS 双向认证的握手信息,用于定位问题 ssl 双向认证理论基础参考: https://blog.csdn.net/ustccw/article/details/76691248