我目前正在研究通过WSE 3.0或WCF加密和签名SOAP消息的主题.由于我没有参与涉及公共Internet的分布式应用程序开发,因此我发现我对X.509证书缺乏知识以及它在Windows证书存储机制中的工作原理.它不是关于非对称密码学; 它是关于PKI生态系统的.
因此,我想收集一些文章或书籍,这些文章或书籍对Windows的安全机制,如何正确使用和管理证书存储,CA信任链以及WSE或WCF等API如何交互并使用证书进行全面解释.建议?
好吧,我对RSA数学运算的理解可能不会那么深,所以如果这是愚蠢的话,请随意拍我的头:
要生成私钥,我们需要两个随机的大素数.没有算法可以精确有效地做到这一点,但是有些算法可以生成大数字,这些数字具有99.99999 ...(数十亿9s)... 999%的概率.
我的问题是:如果通过一个惊人的运气,当你生成你的密钥时,素数生成算法产生了一个非素数会发生什么?这对于使用这个不幸的密钥的软件有何影响?
编辑:我知道其他因素更可能是这个问题的不良结果来源; 这只是纯粹的书呆子数学好奇心.
我试图通过几个步骤处理X509证书并遇到几个问题.我是JCE的新手,所以我还没有完全了解所有内容.
我们希望能够根据不同的编码(PEM,DER和PCKS7)解析几个不同的X509证书.我使用FireFox(证书包括链)以PEM和PCKS7格式从https://belgium.be导出相同的证书.我已经离开了一些问题所不需要的线路
public List<X509Certificate> parse(FileInputStream fis) {
/*
* Generate a X509 Certificate initialized with the data read from the inputstream.
* NOTE: Generation fails when using BufferedInputStream on PKCS7 certificates.
*/
List<X509Certificate> certificates = null;
log.debug("Parsing new certificate.");
certificates = (List<X509Certificate>) cf.generateCertificates(fis);
return certificates;
}
Run Code Online (Sandbox Code Playgroud)
只要我使用FileInputStream而不是PCKS7的BufferedInputStream,这段代码工作正常,我觉得这很奇怪?但我可以忍受它.
下一步是验证这些证书链.1)检查所有证书是否都有有效日期(简单)2)使用OCSP验证证书链(如果证书中未找到OCSP URL,则回退到CRL).这是我不完全确定如何处理这个问题的地方.
我正在使用Sun JCE,但似乎没有那么多文档可用(在示例中)?
我首先做了一个简单的实现,只检查链而不经过OCSP/CRL检查.
private Boolean validateChain(List<X509Certificate> certificates) {
PKIXParameters params;
CertPath certPath;
CertPathValidator certPathValidator;
Boolean valid = Boolean.FALSE;
params = new PKIXParameters(keyStore);
params.setRevocationEnabled(false);
certPath = cf.generateCertPath(certificates);
certPathValidator = CertPathValidator.getInstance("PKIX"); …Run Code Online (Sandbox Code Playgroud) 我对PKI,证书和所有相关的东西都比较新.
据我所知,在公钥加密中,用公钥加密并用私钥解密.只有一个私钥可以对应任何公钥,但反之则不然.这是对的吗?或者是一对一的映射?
因此,数字签名的工作方式是对证书的内容进行哈希处理,然后使用私钥"签名".然后使用相应的公钥验证签名.
所以,这是我感到困惑的地方.使用公钥加密邮件和使用私钥签名邮件摘要有什么区别?
我有一个启用了PKI安全性的站点.每个客户端使用读卡器加载其证书,或者证书安装在其盒子上的IE证书存储中.
所以我的问题是:
我一直在四处寻找,在这种情况下我没有想出任何帮助我的东西.Django有很多模块,但这不是一个选项,因为我只关心客户端的事情.我不是要创建一个托管服务的站点.我需要访问这些服务.
我有这个代码工作的类型.我只是不知道如何处理我得到的重定向:
import httplib
KEYFILE = r"C:\cert\my.key"
CERTFILE = r"c:\cert\my.pem"
HOSTNAME = 'machine.com'
conn = httplib.HTTPSConnection(
HOSTNAME,
key_file = KEYFILE,
cert_file = CERTFILE
)
conn.putrequest('GET', '/arcgis/sharing/rest?f=json')
conn.endheaders()
response = conn.getresponse()
print response.read()
Run Code Online (Sandbox Code Playgroud)
所有这一切的结果是:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://machine.com/pki?https://machine.com/arcgis/sharing/rest%3f&f=json">here</a>.</p>
</body></html>
Run Code Online (Sandbox Code Playgroud)
提供的任何帮助都会很棒!
软件规格:python 2.7.8,Windows 2012 R2
我已经找到了在Apache中使用基于DOD CAC卡的客户端证书身份验证的所有必要步骤,但现在我正在努力从我收到的证书中为用户提供良好的GUID.证书上是否有可用的GUID,在更新CAC卡时不会更改?我正在考虑使用SSL_CLIENT_S_DN,它看起来像:
/ C = US/O =美国政府/ OU = DoD/OU = PKI/OU =承包商/ CN = LAST_NAME.FIRST_NAME.MIDDLE_NAME.0123456789
但是我听说CAC卡更新时最后的数字会发生变化.这是真的?是否有更好的信息用于GUID?我也想获取用户的电子邮件地址,但我在证书中收到的信息中看不到它.电子邮件地址是否在我看不到的某些自定义扩展程序中可用?
谢谢!
我需要生成一个证书,但找不到这个目录.谢谢!
有一个受证书保护的Web服务.在调用它的客户端代码中,证书的CA必须存在于信任库(JRE_path\lib\security\cacerts)中 - 如果不存在,则在客户端获得PKIX异常.
如果证书已过期会发生什么 - 客户端代码失败.
但是,可以通过将证书直接添加到信任库来绕过这一点 - 信任过期的证书
即如果证书本身而不是CA存在于信任库中,那么即使证书已过期,一切都可以正常工作.
在我的场景中,webservice证书是一个自签名证书,所以我无论如何都必须将它添加到信任库,即使证书已过期,客户端也能继续正常工作.
现在我的问题是这将在所有场景中工作 - 我的程序只是一个运行本地JRE的命令行程序.
如果有一个应用程序调用webservice并且应用程序在Websphere,JBoss,WebLogic,Tomcat,Glassfish等上运行,并且自签名证书被添加到该环境的信任库中,我是否还可以认为它将继续工作(不是给出过期的错误)?
我认为它会起作用 - 因为那些应用程序服务器也会像任何程序一样使用JRE - 或者我错过了什么?
有人可以帮助我理解RSA密钥是如何以这些格式存储的吗?我想知道PKCS格式与编码(DER,PEM)之间的区别.根据我的理解,PEM更具人性化.密钥/证书的PEM/DER类似于字符的UTF-8/16吗?DER/PEM有什么意义?对不起有太多问题,但厌倦了谷歌搜索和得到模糊的答案.谢谢.
我正在尝试与SSL进行SSL握手www1.filemail.com.我正在使用cURL cacert.pem,但我收到此错误:
Unacceptable certificate from 188.138.81.30: application verification failure
Run Code Online (Sandbox Code Playgroud)
与任何其他HTTPS网站进行握手有效 - 包括www2.filemail.com.www1并且www2应该配置相同 - 并且它们在所有浏览器中都能正常工作.他们也在这里测试很好(两个站点都发送了相同的证书和中间证书):
为什么我www1使用OpenSSL和cacert.pem文件会遇到这个问题?
www1和www2的证书设置必须有所不同.我已经使用无数的工具(openssl,ssllabs等)进行了测试,试图找出差异 - 但我总是得到两个站点完全相同的结果(运行我的代码时除外)
我在这里错过了什么?这些网站有什么区别?
(应该注意的是,我们使用的是RapidSSL提供的相对便宜的通配符证书 - 所以我猜它与中间证书或跨根证书有关 - 但是当使用上面提到的工具进行测试时,一切似乎都是有序的.)
码:
Poco::SharedPtr<Poco::Net::InvalidCertificateHandler> pCert = new Poco::Net::ConsoleCertificateHandler(false);
Poco::Net::Context::Ptr pContext = new Poco::Net::Context(Poco::Net::Context::CLIENT_USE, "", "", "C:\\cacert.pem", Poco::Net::Context::VERIFY_RELAXED, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
Poco::Net::SSLManager::instance().initializeClient(0, pCert, pContext);
URI uri("https://www1.filemail.com");
Poco::Net::SecureStreamSocket ss(Poco::Net::SocketAddress(uri.getHost().c_str(), uri.getPort()));
ss.completeHandshake();
Run Code Online (Sandbox Code Playgroud) pki ×10
java ×3
cryptography ×2
rsa ×2
ssl ×2
appserver ×1
c++ ×1
cac ×1
certificate ×1
jce ×1
macos ×1
mod-ssl ×1
openssl ×1
pkcs#1 ×1
pkcs#8 ×1
primes ×1
python ×1
python-2.7 ×1
truststore ×1
urllib2 ×1
validation ×1
wcf ×1
web-services ×1
wse ×1
x509 ×1