- 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/
为什么我可以在控制台 window.window.window.window 中执行此操作并无限追加 .window 并返回 DOM 窗口? 最佳答案 因为 window 对象有一个指向它自身的 wi
Windows管理员用户和系统用户之间有什么权限区别吗? 有些时候,我必须将 cmd 窗口提升到系统权限才能删除一些文件。这可能是因为系统用户锁定了文件,或者系统用户可能具有更高的访问权限,我希望找出
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
Windows 服务和 Windows 进程之间的区别是什么? 最佳答案 服务是真正的 Windows 进程,没有区别。服务的唯一特殊之处在于它由操作系统启动并在单独的 session 中运行。一个独
我有一个 Windows 网络 (peer-2-peer) 以及 Active Directory,我需要记录向服务器发送任何类型打印的用户的名称。我想编写一个程序来记录他们的用户名和/或他们各自的
当我让一个 Windows 服务尝试安装另一个 Windows 服务时遇到问题。 具体来说,我有一个 TeamCity 代理在 Windows 2008 AWS 实例上为我运行测试。这些测试是用 Ja
我创建了一个应用程序来接收广播的 Windows 消息,效果很好。当我把它变成一个服务、安装它并启动服务时,该服务没有收到消息。 最佳答案 服务可能必须被授予访问桌面的权限。从服务属性、“登录”选项卡
我正在使用 Delphi 2010 编写应用程序。我希望在 Windows 启动时启动我的应用程序。我需要它在最新版本的 Windows XP、7.0 和最新的服务器中工作。 将其存储在以下关键工作下
我想开发一个适用于所有三个版本的 Windows XP、Vista 和 7 的应用程序。该应用程序允许人们选择要打开的文件,并允许他们在某些操作后保存文件。三个版本的 Windows 中的每一个都有不
对于\Windows\中的文件类型与\Windows\System32 中的文件类型是否有标准约定? 我正在开发一个 SDK,其中包含各种 DLL、帮助程序 exe 和 Windows 服务 exe。
要求是,必须在 WINDOWS7 机器上配置自动登录,但是这个自动登录应该等待(即延迟)直到另一个 Windows 服务发出继续自动登录的信号。 我使用了自定义凭据提供程序,它在其中等待另一个 Win
很抱歉,这不是一个大问题,而是更多的帮助人们解决这些特定问题的方法。我正在解决的问题要求使用串行I/O,但主要在Windows CE 6.0下运行。但是,最近有人问我是否也可以在Windows下运行该
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
不幸的是 SC 命令在 W2000 上还不可用,所以我不能使用它。 我正在尝试检查服务是否在 W2000 服务器上运行,如果它没有运行,脚本应该能够启动该服务。 如何在 Windows 2000 上执
如何在登录到 Windows 之前启动 Windows 窗体应用程序?是否可以在登录到 Windows 之前启动 Windows 窗体应用程序?如果不是,我是否有机会在登录前启动 Windows 服务
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我想在 XML 文件中区分 Windows XP 和 Windows 7。我想我会在 XML 中为它使用一个环境变量。 但是我找不到在 Windows 中定义的任何系统环境变量来提供此信息。 我看到了
有谁知道我可以在注册表中的哪个位置检查机器上是否安装了这些应用程序: Windows 通讯录 Windows 联系人 最佳答案 来自 Microsoft:我知道它说的是 win 95,但 reg 是一
我正在尝试从我的 Windows 服务器调用放置在远程 Windows 服务器上的批处理文件。我在远程服务器上安装了 freeSSHd。我尝试使用 putty/plink 但没有结果。 我使用的命令语
( 大家好。我是 Windows 编程的新手,所以如果已经有人问过我,我提前道歉,我只是不知道要搜索什么,但这个问题一直让我发疯,我知道有人可能真的很容易回答这个问题。) 我的公司有一个在 Windo
我是一名优秀的程序员,十分优秀!