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

阿拉斯泰尔·麦考马克

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

在带有 openssl 连接器的 Tomcat 中,可以使用optional_no_camode,它请求客户端证书但不对其进行验证。

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

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

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

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

阿拉斯泰尔·麦考马克

虽然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">

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Java客户端中接受服务器的自签名ssl证书

如何在Apache HttpClient中使用SSL客户端证书?

Java:带有自签名证书的SSL客户端身份验证

如何使Restlet客户端忽略SSL证书问题

如何使用不同的SSL客户端身份验证证书创建Apache HttpClients池

如何为Websphere MQ客户端启用带有客户端证书的SSL?

客户端SSL证书在移动应用中的安全性如何?

JDBC + SSL:将CA证书,客户端证书和客户端捆绑到一个密钥库文件中

使用客户端SSL证书并生成HTTP 403错误时,iOS 9中的错误

如何为相互验证SSL连接时加载客户端证书?

如何在Scrapy中使用SSL客户端证书(p12)?

Mongo Java客户端:如何连接启用SSL但没有证书的连接?

服务器和客户端证书必须由SSL中的同一CA签名

HAProxy SSL终止-客户端证书扩展密钥用法扩展验证

无法使用OpenSSL的ssl.SSLContext()在Python客户端中接收对等证书

如何在.Net Core中使用客户端SSL证书

.netcore应用程序中的嵌套客户端绕过SSL证书错误

使用客户端应用程序在非SSL中更新Amazon RDS SSL / TLS证书

SSL客户端证书/与ServiceStack的相互身份验证(HttpListener)

客户端的SSL证书

可以将任何SSL证书用于客户端证书身份验证吗?

禁用客户端SSL证书

Linphone上的SSL客户端证书验证

如何在Nginx中允许特定的SSL客户端证书?

服务器 ssl 证书过期对客户端应用程序有什么影响?

如何使用客户端 SSL 证书限制对 GitHub Pages 的访问?

将客户端 ssl 证书变量设置为 openresty 中消息的请求标头

如何使用带有 ssl 证书的 https 客户端调用 apis 表单 java

仅客户端 SSL/TLS 应用程序是否需要证书?