问题标签 [mutual-authentication]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
openssl - 使用 CAPI 和 OpenSSL 进行相互 SSL 身份验证
我需要使用 OpenSSL(通过 libcurl)从我的客户端应用程序(C++)进行双向 SSL 身份验证。我正在通过 MS Crypto API (CAPI) 和 ActivClient 驱动程序从智能卡读取证书,并使用 CAPI 进行证书链验证(这似乎更容易使用 OpenSSL 验证证书链,因为证书链在 MS 证书存储中) . 我可以将客户端证书从 CAPI 转换为 OpenSSL,但我遇到了私钥问题。
看来,为了让服务器验证我的客户端证书,我需要将客户端证书私钥公开给 OpenSSL。目前还不清楚我应该如何做到这一点,或者即使我能做到这一点(这可能取决于密钥是否在证书中标记为“可导出”)。我可以尝试按照Converting private key in windows store to PEM (for OpenSSL) 中的建议,并希望密钥是可导出的,但我想知道我是否走的是正确的道路。
我在这个主题上搜索了很多,但没有找到任何确凿的信息。
任何意见和/或建议表示赞赏!
c# - 使用 openssl 和 .Net 进行相互身份验证
我在我的项目中使用托管 OpenSSL 包装器进行相互身份验证。到目前为止,我所做的是通过调用 .Net 的AuthenticateAsClient
函数发送客户端证书,SslStream
并且我正在从服务器的回调函数中获取服务器证书以及 3 个链证书。但我不知道如何处理这个服务器证书。现在我有两个问题:
即使我在本地计算机上安装了 Root CA,为什么
error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate
在调用函数时仍会出错?AuthenticateAsClient
如何使用托管 OpenSSL 将我在服务器回调函数中获得的服务器证书添加到密钥库中,或者如何使用此服务器证书完成相互身份验证?
任何人都可以帮助我使用 OpenSSL 完成这个相互身份验证过程。
nginx - Nginx 相互认证
我对 Nginx 和相互身份验证有疑问。我的服务器配置如下:
我想用另一个 Nginx 实例(Nginx 作为客户端)连接到服务器。
如何配置 Nginx-Client 以使用证书对服务器进行身份验证?
aes - 为 Cipurse(Java 卡)创建 AES 会话密钥?
我尝试进入密码、相互身份验证等,并认为看看市场上“有什么”可能会很好。现在,cipurse 在其规范中声明了这样一个术语来生成会话密钥:
其中 k0 是会话密钥,kP 是卡上计算的密钥,rT 是来自终端的响应。PAD 代表填充(前导零),PAD 2 代表双填充(前导零),kID 是卡的密钥。
现在据我所知,我以这种方式创建了一个密钥:
现在我的一个问题是关于一个小逗号,即
键 = PAD2 (kP) XOR PAD (rT) , kID
setKey 需要一个byte[]
和一个偏移量,kID 不是一个偏移量 cleary - 这个逗号应该是和“AND”还是应该将这两个表达式连接起来还是完全不同的东西?
指南中的示例 kID 是
for 之后的结果PAD2 (kP) XOR PAD (rT)
是
然后 k0_pre 将是:
我只是不知道这个 AES 密钥是如何从“2”输入密钥生成的
wcf - 具有相互身份验证证书的 WCF Web 服务在客户端链信任验证中失败
我正在为使用 SSL 和证书进行相互身份验证的 WCF Web 服务开发概念证明。
因此,我有 2 个证书均由有效的证书颁发机构提供(这些是生产证书,而不是开发证书)。以下是证书的链和存储位置:
服务器证书链
- 颁发者根 CA
- 中级 1 CA
- 服务器认证证书
我不知道这个细节是否重要:服务器证书是域的通配符证书(* .mydomain.com)
客户端证书链
- 颁发者根 CA
- 中级 2 CA
- 客户端认证证书
颁发者根 CA 是两个证书的通用根 CA。
中间证书是不同的。
店面位置
颁发者根 CA 已导入服务器和客户端计算机上的受信任根 CA中间 CA 1 和 2 已导入服务器和客户端的中间 CA颁发者和中间证书仅具有两个公钥。
服务器证书已导入服务器机器上的个人。该证书有一个私钥。服务器证书已导入客户端计算机上的个人。该证书只有一个公钥。客户端身份验证证书已在服务器和客户端计算机上导入Personal 。这些证书具有两个私钥。
我使用框架 C# 4.0 创建了一个托管在 IIS 8.5 中的简单 WCF 应用程序项目。我在创建项目时使用默认提供的示例类,我刚刚将其重命名为DemoService.svc。然后,我创建了客户端(我为目标用户使用了一个 winform 应用程序,以便有一个图形界面来查看结果)并添加 Web 服务引用。
然后,我修改了服务配置以设置相互身份验证。一切都通过 web.config 完成:
我也修改了客户端配置以设置相互身份验证:
当我通过客户端调用 Web 服务时,它返回一个异常:
System.ServiceModel.Security.SecurityNegotiationException:无法为具有权限“myservice.mydomain.com”的 SSL/TLS 建立安全通道。---> System.Net.WebException:请求被中止:无法创建 SSL/TLS 安全通道。在 System.Net.HttpWebRequest.GetResponse() 在 System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) --- 内部异常堆栈跟踪结束 ---
经过调查,我在服务器的事件查看器中发现了一个条目:
处理异常。异常详细信息:System.IdentityModel.Tokens.SecurityTokenValidationException:X.509 证书 CN=myservice.mydomain 链构建失败。使用的证书具有无法验证的信任链。更换证书或更改 certificateValidationMode。正确处理了证书链,但其中一个 CA 证书不受策略提供者的信任。
在 System.IdentityModel.Selectors.X509CertificateChain.Build(X509Certificate2 证书) 在 System.IdentityModel.Selectors.X509CertificateValidator.ChainTrustValidator.Validate(X509Certificate2 证书) 在 System.IdentityModel.Selectors.X509SecurityTokenAuthenticator.ValidateTokenCore(SecurityToken token) 在 System.IdentityModel.Selectors .SecurityTokenAuthenticator.ValidateToken(SecurityToken token) 在 System.ServiceModel.Channels.HttpsChannelListener
1.CreateSecurityProperty(X509Certificate2 certificate, WindowsIdentity identity, String authType) at System.ServiceModel.Channels.HttpsChannelListener
1.ProcessAuthentication(IHttpAuthenticationContext authenticationContext) 在 System.ServiceModel.Activation.HostedHttpContext.OnProcessAuthentication() 在 System.ServiceModel.Channels.HttpRequestContext.ProcessAuthentication() 在 System. ServiceModel.Channels.HttpChannelListener1.HttpContextReceivedAsyncResult
1.Authenticate() 在 System.ServiceModel.Channels.HttpChannelListener 1.ProcessHttpContextAsync(1.HttpContextReceivedAsyncResult
)
关于这个异常,我发现问题出在客户端认证证书的链验证上,但不知道为什么。在这一点上,我被卡住了!我不知道我的证书有什么问题,也不知道如何找到解决方案。
我真的希望有人可以帮助我解决这个问题。
编辑: 我们已经用另一个客户端证书测试了证书链在服务器和客户端证书上是相同的,它不会改变任何东西。
apache - X.509 客户端身份验证的 Apache + mod_ssl 中间 CA 自动发现
是否可以(...补丁、模块、任何东西...)配置 apache/mod_ssl 网络服务器(任何版本)以自动发现/下载中间颁发 CA 证书到预定义的信任根 CA?
我们需要能够为数以万计的最终用户提供 TLS 客户端身份验证,并且可能需要 Web 服务器信任数百个中间颁发 CA。我们可以访问Axway/Tumbleweed Server Validator来处理链中证书的 SCVP/OCSP/CRL 验证(撤销、OID 策略等),但是为了让 Axway Server Validator 插件通过客户端证书, apache/mod_ssl 必须首先对客户端证书进行身份验证/验证,并且它针对预配置的 apache CA 证书数据库(带有 PEM 编码 CA 证书的串联列表的文本文件或包含单个证书文件的目录的目录)发布链。
无论 apache 是否知道颁发 CA 链(因为 SCVP 将为我验证该链),我都可以接受任何证书,但我找不到任何表明这是可能的信息。
我可以手动(或通过脚本)创建 CA 证书捆绑文本文件,但我确信这将很快成为一个非常大的文件,并且需要定期扫描以删除过期的 CA 证书并添加新颁发的证书。当然,这种方法的问题是,当新的 CA 证书添加到捆绑文件/目录时,需要重新启动网络服务器,并且生成的文件可能有几兆字节大小,这对网络服务器的性能不利.
非常感谢任何帮助和/或想法。
iis - 使用反向代理的客户端证书身份验证
我为我的客户端和服务器使用 SSL 相互身份验证。现在我想添加一个反向代理。据我了解,反向代理无法将客户端证书转发到后端 Web 服务器。我可以解决这个缺点吗?例如,我的反向代理可以将客户端信息发送到我的后端 Web 服务器,以便让我的服务器知道客户端正在使用什么证书?
我使用 IIS 7.5。
ssl - 两个播放服务之间的Nginx双向认证
我有两个远程服务器,它们运行两个播放框架服务(客户端、服务器),我想在它们之间配置 SSL 相互身份验证。
我正在使用 Nginx 作为服务器的反向代理,我正在尝试使用 Nginx 作为客户端前面的正向代理。
反向代理运行良好,我通过将客户端证书导入浏览器并测试身份验证对其进行了测试。我在客户端服务器上的问题我需要在客户端服务器上将 Nginx 配置为转发代理,以在其请求中发送客户端证书。
Nginx 可以做到这一点(我用谷歌搜索了很多,但我找不到方法)。还是我必须使用 Apache 或 squid 作为转发代理?有没有更好的方法在两台服务器之间进行相互 SSL 身份验证?
提前感谢您的任何指导。
java - 使用 HttpURLConnection 设置相互认证客户端
我有一个带有 JSON 有效负载的简单 http 服务,我想使用 Java 测试工具进行测试。最初,我使用 Basic Auth 设置了一个客户端,效果很好;服务器证书在 trustStore 中,我在代码中提供用户名/密码。我发送请求,我得到正确的响应。
我想使用相互身份验证进行相同的测试。我已经在服务器和客户端上设置了密钥库和信任库,并在每个上都导入了必要的证书。
我的问题是我不知道如何告诉 HttpURLConnection 我想要相互证书身份验证。
我试过了:公共类Test3 {
}
我应该在这里: httpConn.setRequestProperty("Authorization", "?????????"); 我意识到我可能需要的不仅仅是这 1 行。我尝试了各种资源来找到合适的值,但还是一片空白。我尝试了各种直观的参数,但得到了“401”错误或 NoSuchAlgorithException。
非常感谢任何帮助、代码、资源链接。
java - Android客户端上的SSL相互身份验证失败接受服务器证书,但服务器没有获得客户端证书
我正在尝试在 Linux 服务器和 Android APP 之间设置相互验证的 SSL。到目前为止,我已经能够让应用程序使用服务器证书通过 SSL 进行通信,但是一旦我将服务器设置为只接受客户端证书,它就会停止工作。服务器配置似乎还可以,但我有点卡住了。我最好的猜测是客户端证书没有正确呈现给服务器,但不知道接下来如何测试它。我尝试在我的 OS X 钥匙串中为客户端使用 .pem,但浏览器似乎不适用于该证书。然后服务器证书再次完美运行,因为我可以实现 https 连接并且 APP 接受我未签名的服务器证书。
我一直在使用的代码是各种教程的组合,答案是我收藏的主要内容:
- http://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/
- Android 上的自签名 SSL 接受
- 使用移动应用程序保护通信 [真实性、隐私性和完整性]?
- (对于服务器配置)https://security.stackexchange.com/questions/34897/configure-ssl-mutual-two-way-authentication
这是我用于连接的两个主要类:1)这个类处理 JSON 解析并执行请求
第二个类处理 SSL 身份验证:
要使用以下命令创建我使用 openssl 的密钥:
为了获得适用于 Android 的 BKS 的密钥,我使用了位于以下位置的充气城堡 bcprov-jdk15on-150.jar:http: //www.bouncycastle.org/latest_releases.html
并使用了命令:
最后,我添加到 /etc/httpd/conf.d/ssl.conf 以要求客户端证书并检查 Fedora 19 中的证书有效性(与我创建的客户端证书匹配)的行是:
我在这个配置文件上尝试了很多组合,并且都以相同的结果结束,给我一个“SSLPeerUnverifiedException:没有对等证书”异常。我在服务器的 SSL 配置文件上评论了这一行,一切正常,但服务器接受所有不是我需要的客户端。
提前致谢 :)
更新
@EJP的回答成功了
首先,我必须将证书添加到正确的 ( /etc/pki/tls/certs/ ) 路径并使用以下命令加载它: 重命名证书: mv ca-andr.pem ca-andr.crt 现在加载证书:
这将创建一个 openSSL 可读符号链接,其名称类似于“f3f24175.0”</p>
然后我在 /etc/httpd/conf.d/ssl.conf 配置文件中设置新的证书文件。
现在重新启动 http 服务并测试证书是否加载:
如果一切正常,您应该看到:
f3f24175.0:好的
您可以通过以下方式结束测试:
这应该返回受信任的客户端证书列表(如果您看到您添加的证书正在运行)
现在问题的第二部分是我的 authclientcerts.BKS 不包含私钥,因此我提供的密码从未使用过,服务器不会对证书进行身份验证。所以我将我的密钥和证书导出到 pkcs12 并相应地更新了 JAVA 代码。
导出命令:
然后我更改了 SecureHttpClient.java 类的部分以使用 PKCS12 而不是 BKS 制作客户端证书。
要将密钥存储类型从 BKS 更改为 PKCS12,我替换了:
为了这:
然后我通过替换更新了对位于 res/raw/ 上的实际密钥存储文件的引用:
为了这:
这就是诀窍:D