目前我们正在使用一种将 CA 证书放在服务器上的方法来访问第三方 API。
certificate_path = os.path.join(CERT_PATH, 'cacert.pem')
certificate_key_path = os.path.join(CERT_PATH, 'cacert.key')
response = requests.get(url, cert=(certificate_path, certificate_key_path))
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我们正在寻找而不是将 CA 证书存储在服务器上,Accounts
出于安全目的(客户提出的安全原因)存储在数据库的表中。
所以问题是:
有没有什么方法可以直接将 CA 证书的字符串传递给requests
直接(除了将内容写入临时文件)?
是否有任何其他http
python 模块支持在http
获取/发布请求中传递 CA 证书的字符串?
我们应该使用其他方法而不是将它们存储在数据库和服务器上吗?
我有一个Android应用程序连接到我们托管的SSL Web服务.Web服务器是apache,它有我们自己创建的CA和自签名SSL证书.
我已将我们的CA证书导入安卓中的用户可信证书部分的Android平板电脑上.
我已经测试了对Web服务器的访问,并且可以确认Web服务证书显示为有效(下面的屏幕截图)
以下是安全设置中的证书:
现在,当我尝试访问应用程序中的Web服务时,我会触发"无对等证书"异常.
这是简化的SSL实现:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// allows network on main thread (temp hack)
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
SchemeRegistry schemeRegistry = new SchemeRegistry();
//schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
schemeRegistry.register(new Scheme("https", newSSLSocketFactory(), 443));
HttpParams params = new BasicHttpParams();
SingleClientConnManager mgr = new SingleClientConnManager(params, schemeRegistry);
HttpClient client = new DefaultHttpClient(mgr, params);
HttpPost httpRequest = new HttpPost("https://our-web-service.com");
try {
client.execute(httpRequest);
} catch (Exception e) {
e.printStackTrace(); // …
Run Code Online (Sandbox Code Playgroud) (我在Ubuntu 14.10上.uname -r => 3.16.0-31-generic)
apt-get update
Failed to fetch https://get.docker.com/ubuntu/dists/docker/main/binary-amd64/Packages server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none.
Run Code Online (Sandbox Code Playgroud)
git clone https://github.com/sdelements/lets-chat.git
I can't clone anything - fatal: unable to access 'https://github.com/sdelements/lets-chat.git/': server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none.
Run Code Online (Sandbox Code Playgroud)
docker run hello-world
Get https://index.docker.io/v1/repositories/library/hello-world/images: x509: certificate signed by unknown authority.
Run Code Online (Sandbox Code Playgroud)
ls /etc/ssl/certs/ca-certificates.crt -l
-rw-r--r-- 1 root root 1964 Mar 26 18:19 /etc/ssl/certs/ca-certificates.crt
Run Code Online (Sandbox Code Playgroud)
任何线索将不胜感激.
我正在研究区块链的概念证明.我正在使用bluemix网络进行区块链和部署我在本地开发的应用程序.我想测试CA功能,并希望向用户添加属性membersrvs.yaml
,并执行基于属性的访问控制.但是,当我的网络托管在bluemix上时,我无法找到如何编辑/更新文件.请原谅我,如果这看起来很基本,我仍然对事情有所了解.
我一直在努力解决SSL问题超过1个月.
我们使用openssl生成自己的CA,服务器和客户端证书.我们还在Apache Web服务器上启用了"SSLrequire"(在htaccess中这可能是错误的),这意味着任何尝试通过服务器上的https连接的人都需要提供有效的证书
步骤如下;
所以我们有自己的CA,用于签署我们的服务器和客户端证书.
下一步
所以我们有服务器证书和服务器私钥,我们在服务器上成功安装
接下来我们
然后,我们将客户端证书与CA证书一起分发给我们的用户.两者都安装在他们的浏览器中.
在尝试连接时,我们得到了"Peer无法识别并信任颁发证书的CA."错误.
我们发现问题是服务器上未安装自签名CA证书.通常,服务器会向尝试连接到它的设备显示可信CA的列表,并且设备必须发送已由服务器提供的任何CA签名的证书.但由于我们的自签名CA证书未安装在服务器上,因此浏览器可以提供服务器可接受的证书.
所以我们在服务器 - 控制面板Hsphere上安装了CA证书.
我们获取了ca证书的内容并将其复制到服务器上的"证书颁发机构文件"文本区域中,并且服务器不会每次都抱怨它"无法更新SSL配置不同的密钥和证书"
CA证书已经自行签名,因此服务器如何说证书和密钥不同.
我们还尝试将CA证书文件和CA密钥文件的内容复制到"证书颁发机构文件"文本区域,但这也不起作用.
正如我所说,我们一直在努力争取一个多月.如果有人能提供帮助,那将非常感激.如果我们需要支付服务费用,请告诉我们.
提前致谢.
在Cygwin上使用git获取时,您会得到:
Fetching origin
fatal: unable to access 'https://.../...git': SSL certificate problem: self signed certificate in certificate chain
error: Could not fetch origin
Run Code Online (Sandbox Code Playgroud)
该证书被添加到/etc/ssl/certs/ca-bundle.crt
和其他捆绑的文件,但在接下来的Cygwin更新的问题又出现了.
我一直在尝试在MacOS X 10.9.5和Python 2.7.9下使用Python-LDAP(版本2.4.19)
我想在调用之后验证我与给定LDAP服务器的连接.start_tls_s()
(或者如果无法验证证书则使方法引发和异常).(我也想检查CRL,但这是另一回事).
这是我的代码:
#!python
#!/usr/bin/env python
import ConfigParser, os, sys
import ldap
CACERTFILE='./ca_ldap.bad'
## CACERTFILE='./ca_ldap.crt'
config = ConfigParser.ConfigParser()
config.read(os.path.expanduser('~/.ssh/creds.ini'))
uid = config.get('LDAP', 'uid')
pwd = config.get('LDAP', 'pwd')
svr = config.get('LDAP', 'svr')
bdn = config.get('LDAP', 'bdn')
ld = ldap.initialize(svr)
ld.protocol_version=ldap.VERSION3
ld.set_option(ldap.OPT_DEBUG_LEVEL, 255 )
ld.set_option(ldap.OPT_PROTOCOL_VERSION, 3)
ld.set_option(ldap.OPT_X_TLS_CACERTFILE, CACERTFILE)
ld.set_option(ldap.OPT_X_TLS_DEMAND, True )
ld.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_HARD)
## From: https://stackoverflow.com/a/7810308/149076
## and : http://python-ldap.cvs.sourceforge.net/viewvc/python-ldap/python-ldap/Demo/initialize.py?revision=1.14&view=markup
ld.start_tls_s()
for each in dir(ldap):
if 'OPT_X_TLS' in each:
try:
print '\t*** %s: %s' % …
Run Code Online (Sandbox Code Playgroud) 我有一个如下所示的证书链:root CA -> intermediate CA -> client certificate
。如何验证收到的证书是否是由“根 CA”显式创建的?
验证整个链条不是问题。这可以这样做:
X509Certificate2 rootCert = new X509Certificate2(rootCertFile);
X509Certificate2 intermediateCert = new X509Certificate2(intermediateCertFile);
X509Certificate2 clientCert = new X509Certificate2(clientCertFile);
chain.ChainPolicy.ExtraStore.Add(rootCert);
chain.ChainPolicy.ExtraStore.Add(intermediateCert);
if(chain.Build(clientCert))
{
// ... chain is valid
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是证书根据(Windows)证书存储进行验证,但我只想根据特定的根 CA 对其进行验证。
我还认为可以检查是否chain.ChainElements
包含我期望的根 CA。但是,如果有人从不同的根 CA 向我发送一条有效链并仅添加我期望的根 CA,该怎么办?
ca ×10
ssl ×4
openssl ×3
self-signed ×3
hyperledger ×2
android ×1
blockchain ×1
c# ×1
certificate ×1
client ×1
cygwin ×1
git ×1
https ×1
ibm-cloud ×1
localhost ×1
python ×1
python-ldap ×1
security ×1
ubuntu ×1