0

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

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

使用 Jetty 9.x,我尝试配置以下SslContextFactory选项无济于事:

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

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

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

4

2 回答 2

0

虽然TrustAll似乎是可能的解决方案,但它只有在没有给出 TrustStoreKeyStore 时才有效。然后您无法使用常规客户端进行连接,因为服务器在握手期间没有证书可提供。

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

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. 针对 Jetty 9.x 编译上面的代码
  3. 在 `$jetty.home/lib/ext' 中安装 jar
  4. 编辑$jetty.home/etc/jetty-ssl-context.xml

    一世。改变:

    <Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
    

    到:

    <Configure id="sslContextFactory" class="media.alu.jetty.SslContextFactoryRelaxed">
    

    ii. 添加<Set name="TrustAll">TRUE</Set>为的孩子<Configure id="sslContextFactory">

于 2017-10-18T15:29:48.647 回答
-2

为什么?JSSE 已经对其进行了验证。您需要做的就是检查该用户的授权。当您访问证书时,它已经通过完整性、永不过期和信任锚定的验证,因此您可以相信它的 SubjectDN 指的是它所说的对象,所以您所要做的就是决定SubjectDN 具有哪些角色(如果有)。

于 2017-10-18T20:39:40.220 回答