首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jetty:如何在应用程序代码中验证SSL客户端证书?

Jetty:如何在应用程序代码中验证SSL客户端证书?
EN

Stack Overflow用户
提问于 2017-10-18 15:29:48
回答 2查看 2.1K关注 0票数 0

我有一个多租户well服务,我想使用相互SSL/TLS身份验证以及用户身份验证。这意味着我需要解析用户和用户允许的证书,这只能在建立连接之后发生。然后,我将使用PKIXCertPathBuilderResult使用在请求中传递的客户端证书来验证信任链。

在带有openssl连接器的Tomcat中,可以使用optional_no_ca模式,它请求客户端证书,但不验证它。

在Jetty9.x中,我尝试配置以下SslContextFactory选项,但没有效果:

  • ValidateCerts=false
  • ValidatePeerCerts=false
  • TrustAll=true

如何在Jetty 9.x中实现这一点?

编辑2019年:要求所有访问系统的客户端设备都提供SSL证书。然后,应用程序将执行证书链和其他证书属性的验证,该应用程序还能够从外部源查找缺少的证书根。这与规范相反--通常情况下,应用服务器将在SSL连接设置期间使用已知的可信CA的预先配置的静态列表执行证书链验证。如果找不到信任,则拒绝SSL连接。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-18 15:29:48

虽然TrustAll似乎是可能的解决方案,但只有在没有给出TrustStore KeyStore的情况下,它才能工作。然后您不能使用常规客户端进行连接,因为服务器在握手过程中没有证书可供使用。

要获得合理的trustAll模式,唯一的选择似乎是扩展SslContextFactory

代码语言:javascript
复制
package media.alu.jetty;
/**
 * SslContextFactoryRelaxed is used to configure SSL connectors
 * as well as HttpClient. It holds all SSL parameters and
 * creates SSL context based on these parameters to be
 * used by the SSL connectors.
 *
 * TrustAll really means trustAll!
 */
@ManagedObject
public class SslContextFactoryRelaxed extends SslContextFactory
{
    private String _keyManagerFactoryAlgorithm = DEFAULT_KEYMANAGERFACTORY_ALGORITHM;
    private String _trustManagerFactoryAlgorithm = DEFAULT_TRUSTMANAGERFACTORY_ALGORITHM;

    @Override
    protected TrustManager[] getTrustManagers(KeyStore trustStore, Collection<? extends CRL> crls) throws Exception
    {
        TrustManager[] managers = null;
        if (trustStore != null)
        {
            if (isTrustAll()) {
                managers = TRUST_ALL_CERTS;
            }

            // Revocation checking is only supported for PKIX algorithm
            else if (isValidatePeerCerts() && "PKIX".equalsIgnoreCase(getTrustManagerFactoryAlgorithm()))
            {
                PKIXBuilderParameters pbParams = newPKIXBuilderParameters(trustStore, crls);

                TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(_trustManagerFactoryAlgorithm);
                trustManagerFactory.init(new CertPathTrustManagerParameters(pbParams));

                managers = trustManagerFactory.getTrustManagers();
            }
            else
            {
                TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(_trustManagerFactoryAlgorithm);
                trustManagerFactory.init(trustStore);

                managers = trustManagerFactory.getTrustManagers();
            }
        }

        return managers;
    }

}

使用:

  1. 按照Jetty文档配置带有客户端身份验证的SSL/TLS
  2. 针对Jetty9.x编译上面的代码
  3. 在‘$jetty.home/lib/ext’中安装jar
  4. 编辑$jetty.home/etc/jetty-ssl-context.xml 一.变革: 至: 二、将<Set name="TrustAll">TRUE</Set>添加为<Configure id="sslContextFactory">的子级
票数 0
EN

Stack Overflow用户

发布于 2017-10-18 20:39:40

为什么?JSSE已经验证了它。您只需检查该用户的授权即可。当您访问证书时,它已经被验证为完整性、不过期和信任锚定,因此您可以相信它的SubjectDN指的是它所指的人,所以您所要做的就是决定SubjectDN的角色(如果有的话)。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46813897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档