如何验证配置相互身份验证(客户端证书、服务器证书)JavaEE的正确性?

如何验证配置相互身份验证(客户端证书、服务器证书)JavaEE的正确性?,java,security,authentication,Java,Security,Authentication,我正在尝试编写一个简单的应用程序,以了解基于客户端和服务器证书配置身份验证的基础知识 我已经完成了javee5、javaee6教程中解释的所有工作 打开javaee教程中的示例hello basicauthorization(只是简单的servlet,只有在身份验证后才能访问),然后将其重新配置为客户端证书,而不是基本授权 配置的web.xml 已配置glassfish-web.xml 生成的客户端证书 已导入客户端证书,以便服务器信任它 问题是: 当我部署我的应用程序并遵循对应于该应用程序的

我正在尝试编写一个简单的应用程序,以了解基于客户端和服务器证书配置身份验证的基础知识

我已经完成了javee5、javaee6教程中解释的所有工作

  • 打开javaee教程中的示例hello basicauthorization(只是简单的servlet,只有在身份验证后才能访问),然后将其重新配置为客户端证书,而不是基本授权
  • 配置的web.xml
  • 已配置glassfish-web.xml
  • 生成的客户端证书
  • 已导入客户端证书,以便服务器信任它
  • 问题是:

    当我部署我的应用程序并遵循对应于该应用程序的链接时,我从glassfish服务器HTTP Status 400收到一条消息-此请求中没有客户端证书链”

    因此,客户端(浏览器)似乎没有随请求一起发送证书

    我尝试将.cer证书添加到Chrome、firefox、internetexplorer中,它们都被添加了(没有显示错误),但正如您所看到的,这并没有帮助

    因此,问题是:


    如何通过具有client.cer证书的web浏览器访问我的应用程序?

    您可以通过添加(Glassfish中的某个地方)系统属性在服务器端调试ssl:

    -Djavax.net.debug=all
    
    有关详细信息,请参阅

    您还可以使用openssl工具从客户端角度进行调试:

    openssl s_client -connect host:port -debug -msg
    
    您应该看到如下内容:

    ...
    Acceptable client certificate CA names
    /C=PL/O=company/OU=xx/CN=host/emailAddress=email@example.com
    /C=PL/O=company/OU=xx/CN=ca/emailAddress=email@example.com
    ---
    SSL handshake has read 2536 bytes and written 116 bytes
    ...
    

    您的问题可能与服务器端错误的truststore配置有关-服务器发送一些可接受的客户端证书CA名称(或根本没有),但浏览器没有提供任何内容-它没有可接受的CA颁发的任何私钥+证书

    您可以通过添加(Glassfish中的某处)系统属性:

    -Djavax.net.debug=all
    
    有关详细信息,请参阅

    您还可以使用openssl工具从客户端角度进行调试:

    openssl s_client -connect host:port -debug -msg
    
    您应该看到如下内容:

    ...
    Acceptable client certificate CA names
    /C=PL/O=company/OU=xx/CN=host/emailAddress=email@example.com
    /C=PL/O=company/OU=xx/CN=ca/emailAddress=email@example.com
    ---
    SSL handshake has read 2536 bytes and written 116 bytes
    ...
    

    您的问题可能与服务器端错误的信任库配置有关-服务器发送一些可接受的客户端证书CA名称(或根本不发送),但浏览器没有提供任何内容-它没有任何由可接受的CA颁发的私钥+证书

    ,因此,问题在于“浏览器没有提供任何东西-它没有任何私钥+由可接受的ca颁发的证书”。如何使浏览器使用我生成的证书?在IE中,您可以选择证书容器-您必须选择“个人证书”(类似于此)。您确定服务器正在请求您的证书吗?不确定。为了使服务器信任我的证书,我使用了以下命令:java home\bin\keytool-import-v-trustcacerts-alias client alias-file client.cer-keystore domain dir/config/cacerts.jks-keypass changeit-storepass changeit,正如这里建议的那样:但错误并没有说明证书错误。它表示客户端没有发送证书。尝试在IE中使用“个人证书”添加证书。没有效果。因此,问题是“浏览器没有提供任何内容-它没有任何由可接受的ca颁发的私钥+证书。”“。如何使浏览器使用我生成的证书?在IE中,您可以选择证书容器-您必须选择“个人证书”(类似于此)。您确定服务器正在请求您的证书吗?不确定。为了使服务器信任我的证书,我使用了以下命令:java home\bin\keytool-import-v-trustcacerts-alias client alias-file client.cer-keystore domain dir/config/cacerts.jks-keypass changeit-storepass changeit,正如这里建议的那样:但错误并没有说明证书错误。它表示客户端未发送证书。尝试在IE中使用“个人证书”添加证书。无效