我尝试使用ColdFusion10 http请求进行客户端证书验证。目前,我所有回来的都是403.7。我相信ColdFusion不会拿起我的客户证书。以下是我目前安装和设置的步骤。
我做了什么:
我之前已经看到CFHTTP和客户端证书存在问题,但我还没有找到解决方案。 如果有人能帮助我,那就太好了。
编辑: 在做了Miguel-F建议之后,我浏览了日志文件,发现我的CA是在ColdFusion信任存储区内导入的,但我的客户端证书并不存在。我认为这就是403.7的原因。
但是,我无法使用certman或keytool通过cmd将我的客户端证书(.pfx)添加到信任存储区。我通过将.cer和.pvk合并在一起创建了.pfx,所以我也同时拥有它们。
如何将我的.pfx添加到信任存储区,以便Coldfusion选择并验证我的https?
编辑#2:编辑#2: 按照此操作将我的.pfx添加到密钥库后,我现在可以看到我的客户端证书以及我的CA被添加为'可信证书'在https请求期间。但是,我仍然收到403.7 - 禁止错误。
编辑#3: 添加我的.pfx(参见编辑#2)后,在ssl调试信息中的握手是:
'Is initial handshake: true'
'catalina-exec-3, WRITE: TLSv1 Handshake, length = 181' (Several of these in 1 request)
编辑#4(更多调试信息):
上面的最后一节,它在调试信息中返回403,看起来像是服务器返回的错误页面的HTML内容。就在上面就是这样:
catalina-exec-3, READ: TLSv1 Application Data, length = 5808
Padded plaintext after DECRYPTION: len = 5808
0000: 48 54 54 50 2F 31 2E 31 20 34 30 33 20 46 6F 72 HTTP/1.1 403 For (Example of the HTML error content)
编辑#5: 我可以看到我的客户端证书在请求开始时被添加为可信证书......它只是没有使用它。
adding as trusted cert:
Subject: CN=George CF10
Issuer: CN=MyPersonalCA
Algorithm: RSA; Serial number: 0x-431b7d9911f9856cb0adf94d50bb1479
Valid from Fri Apr 01 00:00:00 BST 2016 until Wed Apr 01 00:00:00 BST 2020
编辑#6: 将setClientCert(路径到我的.pfx )和setClientCertPassword(客户端证书密码)添加到我的https请求后,我看到了这个错误:
Error while trying to get the SSL client certificate:
java.security.UnrecoverableKeyException: Could not decrypt key: Could not decode key from BER. (Invalid encoding: expected tag not there.).
Check that the certificate path and password are correct and the file is in PKCS#12 format.
答案 0 :(得分:2)
评论太长
您确定已将证书添加到正确的JVM密钥库吗?如果您已在ColdFusion服务器上升级了Java,则它可能不在默认位置。 ColdFusion管理员系统信息页面将告诉您“Java Home”标签下正在使用的路径。
要打开调试信息,请将这些行添加到位于此目录jvm.config
下的ColdFusion服务器的C:\ColdFusion10\cfusion\bin
文件中(默认情况下)并重新启动ColdFusion服务:
-Djavax.net.ssl=debug
-Djavax.net.debug=all
这应该向服务器上的coldfusion-out.log
日志文件添加更多信息。将这些信息发回到您的问题中以供进一步分析。
不需要使用MMC将证书添加到Windows服务器,也无法帮助您从ColdFusion进行cfhttp
次呼叫。它使用Java密钥库。
编辑1和2的响应
按照this other answer中有关如何将.pfx
文件转换为密钥库的步骤进行操作。
编辑3,4和5的响应
如果您仍然打开了ssl调试开关,则应在日志文件中看到握手信息。现在你已经安装了证书了什么?
您是否尝试过使用clientCert
代码的clientCertPassword
和cfhttp
属性?请注意,它需要完整路径到包含请求的客户端证书的PKCS12格式文件。请参阅the docs here。
编辑6的响应
请查看此页面CFHTTP and client certificates,了解您收到的错误消息:Could not decode key from BER.
摘自该页面:
客户端证书似乎是具有PKCS#12格式的私钥的普通客户端证书,但是来自不同的证书链,然后是服务器格式。所以我首先让客户端仔细检查链是否正确安装在服务器上。不幸的是,这并不容易。我会告诉你我所尝试的细节,但最终证明证书编码错误。这些是我将证书转换为工作状态所采取的实际转换步骤:
- 通过MMC导入Windows证书存储区中的证书;
- 使用私钥,整个链并且在PFX formet中没有强加密导出证书;
使用OpenSSL将PFX编码的证书转换为PEM:
openssl pkcs12 -in raw.pfx -out intermediate.pem -nodes
将PEM文件中的证书重新排序为以下顺序:> - 身份证书
- 中级证书
- 根证书
私钥
使用OpenSSL将PEM编码证书转换为PKCS#12:
openssl pkcs12 -export -out final.pkcs -in final.pem
可能跳过/合并这些步骤中的一些(你可能只需要转换为PEM,重新排序并转换回来),但我真的没有时间去探索它,我只是知道这个有效对我来说。
答案 1 :(得分:0)
通过关注this链接解决。
我在HTTP请求的setClientCert中使用了新的.pkcs格式文件,现在它正在运行。
- 通过MMC导入Windows证书存储区中的证书;
- 使用私钥,整个链并且在PFX formet中没有强加密导出证书;
- 使用OpenSSL将PFX编码的证书转换为PEM:
openssl pkcs12 -in raw.pfx -out intermediate.pem -nodes
- 将PEM文件中的证书重新排序为以下顺序:
- 身份证书
- 中级证书
- 根证书
- 私钥
- 使用OpenSSL将PEM编码的证书转换为PKCS#12:
openssl pkcs12 -export -out final.pkcs -in final.pem
可能跳过/合并这些步骤中的一些(你可能只需要转换为PEM,重新排序并转换回来),但我真的没有时间去探索它,我只是知道这个有效对我来说。