使用Websphere MQ 8.x,我们是较大环境中的一个应用程序,并且是某些数据接口的客户端。我们的应用程序是在WildFly 9上运行的Java
EE应用程序,该应用程序使用资源适配器(wmq.jmsra.rar
)与EAR文件一起部署在同一AS中。我们在两个方向上与MQ服务器进行交互。因此,一方面,我们有一些MDB(由于历史渊源仍是EJB
2.x格式而没有注释)列出了一些队列,并由ejb-jar.xml
包含激活配置属性的部署描述符配置destinationType, channel, queueManager, hostName, username, password
。另一方面,我们有一个发送方,它通过JNDI查找队列连接工厂和队列并创建连接。
现在,我们要求新建立的MQ服务器通过SSL和客户端证书进行通信。我们从我们服务器的服务器人员那里获得了这样的证书。所以我的问题是:
更新: 我开始为VM设置全局JSSE属性,因为它一开始就解决了我的问题。
必须设置以下参数:
-Djavax.net.ssl.trustStore=<location of trustStore>
-Djavax.net.ssl.keyStore=<location of keyStore>
-Djavax.net.ssl.keyStorePassword=<password>
另外,由于我使用的是非IBM VM,因此需要设置以下参数:
-Dcom.ibm.mq.cfg.useIBMCipherMappings=false
然后,需要将RAR配置上的密码套件属性standalone-full.xml
与我的WildFly安装的其他连接参数一起设置:
<resource-adapter id="wmq.jms.rar">
...
<connection-definitions>
<connection definition ...>
<config-property name="sslCipherSuite">xxx</config-property>
...
</resource-adapter">
最后,还必须将队列上列出的MDB配置为使用密码套件,因此,在我的情况下,我必须通过为每个MDB添加在ejb-jar.xml中添加它:
<activation-config-property>
<activation-config-property-name>sslCipherSuite</activation-config-property-name>
<activation-config-property-value>xxx</activation-config-property-value>
<activation-config-property>
OP在注释中指出,他们使用OpenJDK 8,并且正在使用IBM MQ
v9.0.0.1资源适配器,该发行版中修复了以下两个已知问题,但将此信息放在此处是为其他可能尚未使用的人带来好处在发布时已修复了这些问题:
APAR IV66840:直到8.0.0.2才支持非IBM JRE中的TLS密码规范。
APAR IT10837:如果使用非IBM JRE查找包含客户机证书的KeyStore,则WildFly 9可能会遇到另一个问题,此问题已在8.0.0.5中修复。
资源适配器包括支持TLS的MQ功能,但使用底层JSSE进行实际加密。
基于RFC 5246它表明TLS客户端应仅返回证书基于所述服务器发送“上是适合
的专有名称[X501]可接受certificate_authorities,在DER编码格式表示。的列表
,这将意味着”如果keyStore中用于不同用途的证书(例如:现有的非MQ证书和MQ证书) 不是
由同一CA链签名的,并且您连接的各种TLS服务器不接受来自其他证书的CA的证书在密钥库中(例如:现有的非MQ证书和MQ证书),那么JSSE将为每个证书返回相应的证书。
例如,如果现有的非MQ证书是由内部CA签名的,而MQ证书是由另一家公司的CA签名的,则MQ公司不太可能会信任您的内部CA证书,相反,您的其他非MQ证书也不太可能您连接到的TLS服务器将信任其他公司的CA。由于JSSE仅返回远程服务器信任的证书,因此它们不会相互影响。您只需要将MQ证书添加到现有密钥库中即可。
RFC 5246相关部分的引号在本文的底部。
@a_cornish_pasty回答“
使用特定的JMS密钥库”的问题也是一种选择,因为它可以让您指定与其他Wildfly使用的密钥库不同的密钥库,此密钥库只能具有MQ证书,因此没有机会导致现有密钥库和证书出现问题。
RFC 5246第7.4.4节规定以下内容:
7.4.4。证书申请
该消息何时发送:
非匿名服务器可以选择从客户端请求证书
(如果适用于所选密码套件)。如果发送了此消息,它将立即跟随ServerKeyExchange消息(如果已发送;否则,该消息将跟随服务器的证书消息)。
然后继续声明:
certificate_authorities
可接受的certificate_authorities的专有名称[X501]的列表 ,以DER编码格式表示。
这些专有名称可以为根CA或从属CA指定所需的专有名称。 因此,此消息可用于描述已知根以及所需的授权空间。
如果certificate_authorities列表为空,则客户可以发送任何具有适当ClientCertificateType的证书,除非有相反的外部安排。
RFC 5246第7.4.6节规定以下内容:
7.4.6。客户证书
该消息何时发送:
这是客户端收到ServerHelloDone消息后可以发送的第一条消息。 仅当服务器请求证书时才发送此消息。
如果没有合适的证书可用,则客户端必须发送不包含证书的证书消息。
即,certificate_list结构的长度为零。如果客户端没有发送任何证书,则服务器可以自行决定是否在没有客户端身份验证的情况下继续握手,或者以致命的handshake_failure警报进行响应。同样,如果证书链的某些方面是不可接受的(例如,它不是由已知的,受信任的CA签名的),则服务器可以自行决定继续握手(考虑到客户端未经身份验证)或发送致命警报。
然后继续声明:
- 如果证书请求消息中的certificate_authorities列表是非空的, 则应由列出的CA之一颁发证书链中的证书之一。
null 有人能帮帮我吗?谢谢。 代码 斯塔克特莱斯
我想使用.Net 4.8下的Windows证书存储中的证书建立GRPC SslCredentials()。此链接非常类似,但不提供有效的解决方案。 https://github.com/grpc/grpc/issues/8978 我使用类似于以下内容的代码。ExportToPEM() 是将证书转换为 PEM 格式的自行尝试,但它不起作用。我希望GRPC的C#包装器能够使这变得容易。
问题内容: 我想要求基于Java 1.7内置HttpsServer的服务器进行客户端证书认证。 我似乎找不到任何使服务器无法通过身份验证的方法。无论客户端证书是受信任的,未知的还是完全不存在的,它都会愉快地为所有旧客户端提供数据。 我对文档的阅读建议,如果不信任客户端,则设置HttpsParameters.setNeedClientAuth(true)应该会导致身份验证失败。我发现有类似问题的人的
问题内容: 我还很陌生,对于使用证书进行身份验证时客户端应该显示的内容有些困惑。 我正在编写一个Java客户端,该客户端需要对POST特定对象进行简单的数据处理URL。那部分工作正常,唯一的问题是应该完成。该部分相当容易处理(无论是使用Java的内置HTTPS支持还是使用Java的内置支持),但是我一直坚持使用客户端证书进行身份验证。我注意到这里已经存在一个非常类似的问题,我还没有尝试使用我的代码
我不熟悉SSL和证书。我一直在做关于客户端证书认证的研究。我看过这个和wiki。 因此,如果我必须为我的B2B REST服务实现客户端证书身份验证解决方案,我应该执行以下操作 要求客户端生成自己的私钥,并为其公钥生成证书(CA 颁发?)。通过电子邮件或 USB 闪存盘发送该证书。 在服务器端将客户端的公共证书导入信任存储区并启用客户端身份验证 在握手期间,客户端会出示其证书并进行身份验证,因为服务
本文向大家介绍什么是客户端证书?相关面试题,主要包含被问及什么是客户端证书?时的应答技巧和注意事项,需要的朋友参考一下 客户端系统向远程服务器发出经过身份验证的请求所用的数字证书被称为客户端证书。客户端证书在许多相互认证设计中起着非常重要的作用,为请求者的身份提供了强有力的保证。