关于Jfinal https双向认证的问题(获取客户端证书)

已经按照波总在(http://www.jfinal.com/feedback/6697)中的描述修改了SslBuilder.java,但是还是无法通过

getRequest().getAttribute("javax.servlet.request.X509Certificate");

获取客户端证书,我应该如何操作才能获取到客户端的证书?

评论区

JFinal

2020-10-20 15:58

要对 SSL 的机制有个大概的了解,不用太深

你要解决 ssl 认证的问题,关键在于 SSLContext 的使用,SSLContext.init(...) 方法的前两个参数 init(KeyManager[] km, TrustManager[] tm),其中:
1:第一个参数是由该应用本身的证书加载而来的
2:第二个参数是该应用可以信任的客户端证书相关的文件加载而来的

我举个例子,你的 jfinal undertow 项目,默认是信任所有客户端的,所以第二个参数为 null。

当第二个参数为是 null 的时候,在客户端发起请求的时候就会根据这个参数来验证客户端是不是可以访问

wiboson

2020-10-21 13:15

我已经使用传入了可以信任的客户端证书相关文件加载来的TrustManager,但是通过servlet规范取javax.servlet.request.X509Certificate却还是取不到客户端证书信息,这是我TrustManager构建的不对么?

JFinal

2020-10-21 16:27

@wiboson 是不是你前端还有 nginx 这类代理,挡住了客户端证书

wiboson

2020-10-21 19:43

@JFinal 没有,是直连的undertow,我再研究研究吧

JFinal

2020-10-21 20:50

@wiboson 检查一下客户端在发送请求时带没带上自己的公钥/证书,你当前没获取到,没准是客户端的事

wiboson

2020-10-25 16:14

@JFinal 解决了,关键是在undertow中设置需要客户端证书的选项,builder.setSocketOption(Options.SSL_CLIENT_AUTH_MODE, SslClientAuthMode.REQUESTED);

JFinal

2020-10-25 23:54

@wiboson 原来是少了个配置,感谢你的反馈与分享,解决方案我会写入文档中

热门反馈

扫码入社