- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个工作应用程序,它与服务器建立 SSL 连接。服务器使用自签名证书,客户端加载证书颁发机构链以告诉它服务器可以信任。我在客户端用这样的代码做到了这一点:
SSL_METHOD* method = TLSv1_client_method();
_ctx = SSL_CTX_new(method);
if ( SSL_CTX_load_verify_locations(_ctx, "ca-all.crt", NULL) != 1 )
{
return false;
}
_ssl = SSL_new(_ctx);
int val = SSL_set_fd(_ssl, _socket->GetFD());
if ( val != SSL_SUCCESS )
{
int err = SSL_get_error(_ssl, val);
return false;
}
val = SSL_connect(_ssl);
在服务器上:
if ( SSL_CTX_use_certificate_chain_file( g_ctx, "ca-chain1.crt" ) <= 0 ) {
return 1;
}
ppem_file = getenv( "PEM_FILE" );
if ( ppem_file == NULL ) {
ppem_file = pem_file;
}
if ( SSL_CTX_use_certificate_file( g_ctx, ppem_file,
SSL_FILETYPE_PEM ) <= 0 ) {
return 1;
}
if ( SSL_CTX_use_PrivateKey_file( g_ctx, ppem_file,
SSL_FILETYPE_PEM ) <= 0 ) {
return 2;
}
我正在尝试修改此代码,以便服务器也验证客户端的对等证书(自签名,使用与服务器相同的颁发者)并且遇到了一些麻烦。我在任何地方都找不到好的“概念概述”文档,这似乎是 OpenSSL 库的典型障碍。
我在客户端调用 SSL_CTX_load_verify_locations() 后添加了这个:
if ( SSL_CTX_use_certificate_file(_ctx, "generic_client.pem", SSL_FILETYPE_PEM ) != 1 )
{
return false;
}
在服务器上,我在 SSL_CTX_use_PrivateKey_file() 调用之后添加了这个:
STACK_OF(X509_NAME) *list;
list = SSL_load_client_CA_file( "ca_chain2.crt" );
if( list == NULL ) {
return 4;
}
SSL_CTX_set_client_CA_list( g_ctx, list );
SSL_CTX_set_verify( g_ctx, SSL_VERIFY_PEER, NULL );
连接失败,因为证书未通过验证。客户端似乎可以很好地加载证书,如果我注释掉 SSL_CTX_set_verify 行,客户端可以毫无问题地连接(因为它的证书从未经过验证)。
服务端好像觉得客户端的证书授权链不好。我在这里缺少什么?
我可以从命令行运行:openssl 验证-CAfile ca-chain2.crt generic_client.pem它通过了,所以我有可用的正确证书数据,我一定是用错了。
最佳答案
在服务器上,您还必须调用 SSL_CTX_load_verify_locations()
。该函数告诉服务器使用什么证书进行证书验证; SSL_CTX_set_client_CA_list()
函数设置在握手中发送给客户端的允许的 CA 列表。两者都是必需的。
(在 use_certificate_file
调用之后,您还需要在客户端调用 SSL_CTX_use_PrivateKey_file()
,但我想您正在这样做,只是将其遗漏了)。
关于c++ - OpenSSL 在 C++ 中验证对等(客户端)证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4261369/
我希望我的 C/C++ 客户端通过 SSL 验证服务器。我首先使用 从服务器下载了证书文件 openssl s_client -showcerts -connect www.openssl.org:4
我正在尝试学习使用 RSelenium。我坚持只是尝试使用 rsDriver 启动服务器。我只是想运行下面的代码并得到以下错误: rD = 8 x64 (build 9200) Matrix prod
我已经建立了一个 8 组织的单 channel 结构网络。我能够进行整个网络设置。但是设置成功后。一些 docker 实例停止监听它们各自的端口。当我做 docker ps -a它显示了一些对等节点图
如何在多个 Azure Kubernetes 集群上的 Pod 之间配置路由? 与 Google Cloud 上的 ip-alias/vpc-native 类似的内容 最佳答案 在 AKS 中,我认为
我正在尝试实现点对点连接应用程序。所以我想将 2 个以上的设备相互连接。如何为每对设备创建单独的 session 使用新的 GameKit 框架是否可以连接到 1 个以上的设备? 最佳答案 您可以使用
我一直致力于创建一个 VPC 对等连接,该连接可以使用 cloudformation 从 eu-west-1 与 us-east-1 进行对等。这是目前的云信息: AWSTemplateFormatV
我正在尝试在两个不同区域之间进行 vpc 对等互连。在这里我已经创建了资源,现在我只想将它们的 id 作为参数传递。在同一区域,我可以在两个 VPC 之间进行对等。但我在两个不同的区域收到错误,因为r
我是一名优秀的程序员,十分优秀!