- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
如何(如果有的话)为 OpenSSL 定义一个单一的可信证书文件在 Windows(Win-7,OpenSSL 1.0.1c)上使用 SSL_CERT_FILE 环境变量?
各种研究促使我下载了 Mozilla 的 2012 年 12 月版PEM 格式的受信任证书,来自此处:http://curl.haxx.se/docs/caextract.html这包含连接在一起的所有证书和各种相关信息合并到一个文件中。
我找到了各种关于环境变量用法的引用资料SSL_CERT_DIR 和 SSL_CERT_FILE 相对于依赖于其他产品打开SSL。例如,http://lynx.isc.org/current/README.sslcerts表示可以设置这两个,底层的 OpenSSL 库将使用他们。然而,这并不是我使用 OpenSSL 工具本身的经验。
我能够成功地使用 SSL_CERT_DIR,但非常痛苦,如下所示。我从 www.wellsfargo.com 导出(从 IE 8)证书(选择随机),连同其信任链中的两个证书,都来自威瑞信。我将两个 Verisign 证书中的每一个都放在目录 C:\ca_stuff 中,并为每个生成一个散列
openssl x509 -hash -noout -in "Verisign Intl Server.cer"
它有输出 a302054c,并由此创建了一个链接
mklink a302054c.0 "Verisign Intl Server.cer"
对于其他 Verisign 证书也是如此。然后我放了 Wells Fargo 证书。在一个不同的目录,并且能够使用
成功验证它设置 SSL_CERT_DIR=C:\ca_stuff openssl 验证“富国银行 web.cer”
但是,定义SSL_CERT_FILE后,指向下载的cacert.pem从 cURL 站点下载,相同的命令失败。它这样做了并且没有定义 SSL_CERT_DIR。我验证了必要的 CA证书在 bundle 中,并确认其序列号匹配那些我从 IE 中手动提取的。
手动提取每个证书并放入其中似乎是一个艰巨的过程它在自己的文件中,并带有指向它的哈希链接。如果这是 Unix,我可以自动化它,但在 Windows 上......我显然误解了如何让一个大的 CA 证书文件与 OpenSSL 一起工作。
提前感谢您提供的任何建议、见解和帮助。
最佳答案
How (if at all) can one define a single trusted certificate file for OpenSSL
CAFile 只是您信任并希望使用的自签名证书的串联。如果您只想信任一个,那么 CA 文件中应该只有一个。
我更喜欢 PEM 编码,因为它更容易用文本编辑器检查(-----BEGIN CERTIFICATE-----
和-----END CERTIFICATE-- ---
)。例如,这是来自 Startcom (http://www.startssl.com/certs/) 的 ca-bundle.pem:
因此,要创建一个,只需使用 cat
和重定向(或复制和粘贴):
# Empty my-ca-file.pem
echo "" > my-ca-file.pem
# Add Startcom certs
cat startcom-ca-bundle.pem >> my-ca-file.pem
# Add others as desired
...
Various research led me to download the December '12 version of Mozilla's trusted certificates in PEM format...
嗯,这是您可以使用的列表之一。当您使用 Mozilla 的列表时,您是在说“我相信 Mozilla 会做正确的事”。请记住,当 Trustwave 被发现拦截 SSL/TLS 流量时,Mozilla 奖励了 Trustwave 的不良行为。尽管 Trustwave 违反了至少两项包含政策,但 Mozilla 继续将它们包含在内,因为 Trustwave promise 再也不会这样做。参见 Remove Trustwave Certificate(s) from trusted root certificates了解详情。
如果你不相信 Mozilla 的判断,那么你可以使用 OpenSSL 的内置列表 /usr/lib/ssl/certs/ca-certificates.crt
,使用另一个列表(最主要的供应商有),或构建您自己的。
使用不同的供应商列表通常等同于用您认识的魔鬼换取您不认识的魔鬼。例如,Apple 有一个他们使用的列表,您可以在 iOS: List of available trusted root certificates (iOS 7) 查看该列表。 .但是苹果的列表有很多问题:http://seclists.org/fulldisclosure/2013/Sep/186和 http://seclists.org/fulldisclosure/2013/Sep/184 .
我建议您建立自己的列表或固定证书。固定证书或公钥更好,因为它消除了 SSL/TLS 中允许 Trustwave 做他们所做的事情的系统性问题。参见 OWASP 的 Certificate and Public Key Pinning了解详情。
... on Windows (Win-7, OpenSSL 1.0.1c) using the
SSL_CERT_FILE
environment variable?
我不知道如何通过环境变量来实现,因为我不使用它们。但是 Linux/Unix/OSX/Windows 之间应该没有区别(可能除了处理长文件名和空格)。
查看 OpenSSL 源代码,您在 cryptlib.h
中有以下内容:
#define X509_CERT_FILE_EVP "SSL_CERT_FILE"
x509_def.c
使用 X509_CERT_FILE_EVP
:
const char *X509_get_default_cert_file_env(void)
{ return(X509_CERT_FILE_EVP); }
X509_get_default_cert_file_env
在by_file_ctrl
中的by_file.c
中使用:
...
switch (cmd)
{
case X509_L_FILE_LOAD:
if (argl == X509_FILETYPE_DEFAULT)
{
file = (char *)getenv(X509_get_default_cert_file_env());
if (file)
ok = (X509_load_cert_crl_file(ctx,file,
X509_FILETYPE_PEM) != 0);
else
ok = (X509_load_cert_crl_file(ctx,X509_get_default_cert_file(),
X509_FILETYPE_PEM) != 0);
if (!ok)
{
X509err(X509_F_BY_FILE_CTRL,X509_R_LOADING_DEFAULTS);
}
}
else
{
if(argl == X509_FILETYPE_PEM)
ok = (X509_load_cert_crl_file(ctx,argp,
X509_FILETYPE_PEM) != 0);
else
ok = (X509_load_cert_file(ctx,argp,(int)argl) != 0);
}
break;
}
return(ok);
因此,在使用 SSL_CERT_FILE
时,首选(必需?)PEM 格式的串联。
最后,确保 SSL_CERT_FILE
没有被配置文件设置覆盖。参见 OpenSSL config(5)了解详情。
It seems like an arduous process to manually extract each certificate and put it in its own file with a hash link pointing at it.
我认为您在使用 SSL_CERT_FILE
、-CAfile
或 SSL_CTX_load_verify_locations
时不需要重新散列。
在使用 -CAfile
或 SSL_CTX_load_verify_locations
时,我从未重新哈希过,并且一切正常。当出现问题时,通常是因为 (1) 根证书不存在或不受信任;或 (2) 中间证书不存在。
对于上面的第(2)项,您需要服务器发送所有需要的证书来构建链。否则,客户端将不知道到哪里寻找丢失的中间证书。是 PKI 中一个众所周知的问题,称为“Which Directory”问题(客户端不知道要在哪个 X500 目录中搜索丢失的证书)。
相关的,这里介绍如何在OpenSSL的s_client
中使用它们。这实际上有效,因为 pagepeeker.com 使用 StartCom,如果您省略 -CAfile
选项,它将失败:
$ echo "GET / HTTP\1.1" | openssl s_client -connect api.pagepeeker.com:443 -CAfile startcom-ca-bundle.pem
CONNECTED(00000003)
depth=2 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Certification Authority
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
0 s:/description=8CTO6gSuxeRRsIXl/C=RO/CN=api.pagepeeker.com/emailAddress=alexandru.florescu@gmail.com
i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA
1 s:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA
i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority
2 s:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority
i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIGZTCCBU2gAwIBAgIDCJkoMA0GCSqGSIb3DQEBBQUAMIGMMQswCQYDVQQGEwJJ
TDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0
...
以及做C编程时的相关代码。这是我用来设置 SSL/TLS 连接的代码的一部分(除了公钥固定):
int ret = 0;
unsigned long ssl_err = 0;
SSL_CTX* ctx = NULL;
do
{
ret = SSL_library_init();
ssl_err = ERR_get_error();
if(!(1 == ret))
{
display_error("SSL_library_init", ssl_err);
break; /* failed */
}
/* SSLv23_method() is 'everything' */
const SSL_METHOD* method = SSLv23_method();
ssl_err = ERR_get_error();
if(!(NULL != method))
{
display_error("SSLv23_method", ssl_err);
break; /* failed */
}
/* http://www.openssl.org/docs/ssl/ctx_new.html */
ctx = SSL_CTX_new(method);
ssl_err = ERR_get_error();
if(!(ctx != NULL))
{
display_error("SSL_CTX_new", ssl_err);
break; /* failed */
}
/* Enable standard certificate validation and our callback */
/* https://www.openssl.org/docs/ssl/ctx_set_verify.html */
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, my_verify_cb);
/* Cannot fail ??? */
/* Remove most egregious */
const long flags = SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION;
long old_opts = SSL_CTX_set_options(ctx, flags);
UNUSED(old_opts);
/* http://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.html */
ret = SSL_CTX_load_verify_locations(ctx, "startcom-ca-bundle.pem", NULL);
ssl_err = ERR_get_error();
if(!(1 == ret))
display_warning("SSL_CTX_load_verify_locations", ssl_err);
} while(0);
// Use context
return ctx;
如果 SSL_CTX_load_verify_locations
失败也没关系。这意味着你不会信任任何东西,所以你会失败或关闭。
关于openssl - 如何将 SSL_CERT_FILE 用于 OpenSSL Windows (OpenSSL 1.0.1c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14286265/
如果我使用open ssl命令 sudo openssl genrsa -out privkey.pem 2048 要生成rsa key ,它仅生成1个文件。这是私钥。我如何获得公钥。 最佳答案 回答
三个不同版本的 openssl 正在同时更新 openssl.org : 0.98, 1.0.0, 1.0.1?它们之间有什么区别,我该如何选择要使用的版本? 最佳答案 https://en.wiki
我有以下命令用于 OpenSSL 生成私钥和公钥: openssl genrsa –aes-128-cbc –out priv.pem –passout pass:[privateKeyPass] 2
我正在尝试使用对应的 gcc (arm-none-eabi-5_4-2016q2) 为 cortex m3 机器交叉编译 openssl。机器应该有能力做 TCP 请求,我们希望在一天结束时做 HTT
我正在尝试使用 openssl dsa 实现,但我对以下细节感到非常困惑: 命令 openssl dsa .... 的选项“-text”:输出中的十六进制数字,我是否正确地假设这些是字节,因此它们是按
我正在尝试制作一个假 CA 并用它签署一个证书以与 stunnel 一起使用(这似乎只是调用 OpenSSL 例程,因此您可能不需要了解该程序来提供帮助:)。然而,stunnel 一直拒绝我的证书,说
不幸的是,Perl 在尝试安装 OpenSSL 的手册页(例如 OpenSSL_1_0_1g)时不知何故遇到了错误。因为我不需要它们 - 我只想使用 OpenSSL 作为 C 库,我想我可以通过完全跳
OpenSSL 中的 BIO 对到底是什么?它的用途是什么?我已经检查过 OpenSSL 文档,但任何细节都很少。 最佳答案 OpenSSL 中的 BIO 类似于文件句柄。您可以使用一对它们来安全地相
openssl ca 和 openssl x509 命令有什么区别?我正在使用它来创建和签署我的 root-ca、intermed-ca 和客户端证书,但是 openssl ca 命令不会在证书上注册
如何(如果有的话)为 OpenSSL 定义一个单一的可信证书文件在 Windows(Win-7,OpenSSL 1.0.1c)上使用 SSL_CERT_FILE 环境变量? 各种研究促使我下载了 Mo
我有一个自签名证书,其中显示了列出的基本约束,但从中生成的签名请求不显示这些属性,例如 [v3_req]。我怎样才能让它可见?我正在使用 openssl 生成证书。 场景: 我使用以下方法创建自签名证
这个问题在这里已经有了答案: Check if a connection is TLSv1 vs SSLv3 (SSL_CIPHER_description/SSL_CIPHER_get_name)
是否有更简单的方法来确定在构建 openssl 期间指定的选项,例如当时是否定义了 OPENSSL_NO_SRTP? 我只能从以下方面获得有限的信息: openssl 版本 -a 命令。但是,如果我只
我们正在与 AWS Nitro 合作,仅提供 3 小时的证书。 我们正在寻找一种可以跳过验证中的过期部分并仍然确认证书链有效的方法。 最佳答案 根据 openssl-verify 文档
嗨,我如何在 Easyphp 中启用 openssl,因为我收到错误消息无法发送。Mailer 错误:缺少扩展:opensslTime:使用 phpmailer 时。谢谢 最佳答案 在您的 php.i
我正在尝试以编程方式读取 OpenSSL 警报消息,但无法找到执行此操作的方法。 OpenSSL API 提供如下功能: const char *SSL_alert_type_string(int v
我跑了openssl speed在我的 Ubuntu 计算机上。一些结果: Doing md4 for 3s on 16 size blocks: 9063888 md4's in 3.00s Doi
我编译了带有cryptodev支持(即硬件加速)的OpenSSL,但不幸的是默认引擎仍然是软件。 time openssl speed -evp aes-128-cbc -engine cryptod
我需要从 RedHat Linux 服务器连接到 Microsoft Dynamics CRM 服务器。地址是xxx.api.crm4.dynamics.com。服务器接受 TLSv1 但不接受 1.
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 上个月关闭。 Improve thi
我是一名优秀的程序员,十分优秀!