我无法在iOS上使用CRL。我创建了两个测试用例。我有由CA颁发的有效证书。我有由CA颁发的另一个有效证书,但是CA已将该证书添加到其CRL中。
然后,我设置了一个启用CRL检查并要求成功的吊销策略。
func crlValidationTest(trustedCert: SecCertificate, certToVerify: SecCertificate) -> Bool {
let basicPolicy = SecPolicyCreateBasicX509()
let crlPolicy = SecPolicyCreateRevocation(kSecRevocationOCSPMethod | kSecRevocationCRLMethod | kSecRevocationRequirePositiveResponse)!
var trust: SecTrust?
SecTrustCreateWithCertificates(NSArray(object: certToVerify), NSArray(objects: basicPolicy, crlPolicy), &trust)
SecTrustSetAnchorCertificates(trust!, NSArray(object: trustedCert))
SecTrustSetNetworkFetchAllowed(trust!, true)
var trustResult = SecTrustResultType.invalid
guard SecTrustEvaluate(trust!, &trustResult) == errSecSuccess else {
return false
}
return trustResult == SecTrustResultType.proceed || trustResult == SecTrustResultType.unspecified
}
Run Code Online (Sandbox Code Playgroud)
我的期望是CRL上的证书将不受信任,而干净的证书将受到信任。
在上述配置的情况下,两者均会由于不受信任而失败。如果删除该kSecRevocationRequirePositiveResponse标志,则两者均成功。我已经尝试过仅使用OSCP或仅使用CRL的所有不同排列方式,但没有一种能达到我期望的效果。
Apple 的州文件SecPolicyCreateRevocation:
除非您希望覆盖默认的系统行为(例如强制使用特定方法或完全禁用吊销检查),否则通常无需自己创建吊销策略。
仅使用该SecPolicyCreateBasicX509策略就可以使两者都成功(当第二个证书应该失败时),那么Apple的默认行为是根本不进行CRL检查吗?
我将CharlesProxy附加到我的设备上,并在侦听所有网络流量的同时多次运行该代码,并且没有出站请求发送到CRL,这解释了为什么RequirePositiveResponse选中该标志时所有请求都失败。
我还尝试使用进行从设备直接导航到CRL的操作URLRequest,并且能够毫无问题地获取设备上的CRL数据。 …
当您请求OCSP服务器检查证书的撤销状态时,它是否会自动检查整个链的撤销状态?
即:如果证明证书"好",那么这意味着整个链条是好的吗?
我阅读了规范:http://www.ietf.org/rfc/rfc2560.txt
但我似乎还不清楚.
维基百科确实提到了链式OCSP请求:
http://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol
我想验证X509证书.我想去X509Certificate2.Verify()方法.
但是,文档并没有说明它验证的所有内容.
.net certificate-revocation x509certificate2 x509certificate
我在使用openssl创建包含用于测试的crl分发点的x509证书时遇到问题.
我已经检查了文档,并为此找到了配置设置crlDistributionPoints.不幸的是,openssl总是生成x509版本1证书,而不是使用crl分发点而不是版本3证书.我确定我的命令或配置有问题,但仔细阅读文档并使用配置并没有帮助.考虑配置文件中的其他设置,因此我确信openssl使用该文件本身.
我正在使用该命令
openssl x509 -req -in $NAME.csr -out certs/$NAME.pem -days 3650 -CAcreateserial -CA cacert.pem -CAkey private/cakey.pem -CAserial serial
Run Code Online (Sandbox Code Playgroud)
我正在使用以下配置文件:
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /home/ca
database = $dir/index.txt
new_certs_dir = $dir/newcerts
certificate = $dir/cacert.pem
serial = $dir/serial
private_key = $dir/private/cakey.pem
RANDFILE = $dir/private/.rand
default_days = 3650
default_crl_days = 30
default_md = md5
policy = policy_any
email_in_dn = no
name_opt = ca_default
cert_opt = ca_default
copy_extensions = none
x509_extensions = extensions_section
[ extensions_section ] …Run Code Online (Sandbox Code Playgroud) 我想验证客户端针对CRL提供的X509证书,看看它是否已被撤销.我已成功实现了一个java.security.cert.X509CRL,但我在检索会话证书时遇到问题:
try {
SSLSocket s = (SSLSocket) serverSocket.accept();
s.setSoTimeout(TIMEOUT_RW * 1000);
s.startHandshake();
SSLSession session = s.getSession();
X509Certificate[] cert = session.getPeerCertificateChain();
if (crl.isRevoked(cert[0])) {
System.err.println("Attempted to stablish connection using revoked certificate");
} else {
...
}
} catch (Exception ex) {
System.err.println("Something went wrong");
}
Run Code Online (Sandbox Code Playgroud)
SSLSession属于javax.net.ssl 包,其方法getPeerCertificateChain()返回一个javax.security.cert.X509Certificate[],无法转换为java.security.cert.X509Certificate[]我需要提供的包java.security.cert.X509CRL.怎么做到呢?
我已经使用 Bouncy Castle 构建了我自己的根 CA 证书,并且我正在使用它来构建其他证书。我想使用 Bouncy Castle C# 构建证书吊销列表 (CRL) 以包含吊销证书的列表。例子:
//Retrieve CA root certificate
X509Store CAstore = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
CAstore.Open(OpenFlags.ReadWrite | OpenFlags.OpenExistingOnly);
X509Certificate2Collection x509Certificate2Collection =
CAstore.Certificates.Find(X509FindType.FindBySerialNumber,
this.textBoxSerialCA.Text, true);
X509Certificate2 cert = x509Certificate2Collection[0];
var certCA = DotNetUtilities.FromX509Certificate(cert);
CAstore.Close();
X509V2CrlGenerator crlGen = new X509V2CrlGenerator();
crlGen.SetIssuerDN(certCA.IssuerDN);
crlGen.SetThisUpdate(DateTime.Now);
crlGen.SetNextUpdate(DateTime.Now.AddYears(1));
crlGen.SetSignatureAlgorithm("SHA1withRSA");
crlGen.AddCrlEntry(BigInteger.One, DateTime.Now, CrlReason.PrivilegeWithdrawn);
crlGen.AddExtension(X509Extensions.AuthorityKeyIdentifier,
false,
new AuthorityKeyIdentifierStructure(certCA));
crlGen.AddExtension(X509Extensions.CrlNumber,
false,
new CrlNumber(BigInteger.One));
var randomGenerator = new CryptoApiRandomGenerator();
var random = new SecureRandom(randomGenerator);
var Akp = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair(cert.PrivateKey).Private;
X509Crl crlTemp = crlGen.Generate(Akp,random);
Run Code Online (Sandbox Code Playgroud)
一切都好,直到这一点。如何将 X509Crl …
撤销过期的证书是一个好方法吗?
过期的证书被视为无效证书,但可以撤销它。既然可以撤销它,那么这应该是 CA 的有效方法。
CA是否没有考虑它是否被撤销以及它会如何影响证书的使用方式。
我目前正在使用SSL编写网络TCP服务器.在生产中,我们最终会要求客户使用证书进行身份验证.
为了在紧急情况下撤销证书,我们还想建立一个CRL.
我的问题是:Java是否开箱即用检查CRL(如果提供证书)或者我是否需要手动实施此类检查?
为了测试,我准备了一个带有CRL集的证书,但是Java似乎没有尝试验证它(我将它放入本地Web服务器并且没有访问权限).
我只找到了com.sun.net.ssl.checkRevocation = true VM选项,但显然它不查询CRL.设置为java.security.debug = certpath的 VM调试不会生成任何输出,要么......
Java似乎在其子系统中有相关的类(例如java.security.cert.X509CRLSelector),但它显然没有发挥作用.
我使用Apache Mina作为客户端服务器编写了一个小型的maven风格的项目,它基于密钥/信任库和客户端/服务器的自签名证书初始化SSLContext,可以在这里以ZIP存档的形式下载:https://www.dropbox.com /s/3fqmd1v9mn2a5ve/ssltest.zip?dl=0
我正在尝试做一些愚蠢的事情:加载CRL并输出已撤销的证书序列号列表.
使用M2Crypto加载CRL完成:
import M2Crypto
crl = M2crypto.X509.load_crl('my.crl')
Run Code Online (Sandbox Code Playgroud)
但我真的很惊讶返回的对象只有一个有用的
crl.as_text()
Run Code Online (Sandbox Code Playgroud)
使用一些正则表达式,我可以解析输出以检索已撤销的连续出版物.但还有另一种方法吗?
有关信息,这是一个经典的CRL as_text输出.
Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm: sha1WithRSAEncryption
Issuer: /C=FR/ST=IDF/L=Paris/O=XXXXX/OU=XXXXX/CN=XXXXX Certificate Authority
Last Update: Nov 6 21:49:51 2010 GMT
Next Update: Nov 7 21:49:51 2010 GMT
Revoked Certificates:
Serial Number: 02
Revocation Date: Aug 10 15:40:09 2010 GMT
Serial Number: 03
Revocation Date: Sep 9 15:12:24 2010 GMT
Serial Number: 05
Revocation Date: Aug 17 14:18:22 2010 GMT
Serial Number: 06
Revocation Date: Aug 18 08:57:15 …Run Code Online (Sandbox Code Playgroud) 我正在使用WinVerifyTrust来验证文件签名.
与互联网的连接非常糟糕,所以我想只检查本地缓存.
问题是我对如何在WinTrustData中设置参数感到困惑
关于fdwRevocationChecks - 文档如下:
当WTD_REVOKE_NONE标志与WinVerifyTrust函数的pgActionID参数中设置的HTTPSPROV_ACTION值一起使用时,不会进行额外的吊销检查.要确保WinVerifyTrust函数在验证代码签名时不尝试任何网络检索,必须在dwProvFlags参数中设置WTD_CACHE_ONLY_URL_RETRIEVAL.
它是什么意思"没有额外的撤销检查" - 除了什么?它是否使用CRL进行撤销检查?如果我将此字段设置为*WTD_REVOKE_WHOLECHAIN*它也将在线检查吗?
如果我设置WTD_CACHE_ONLY_URL_RETRIEVAL就足够了,以确保它不会尝试从互联网上获取撤销列表?
底线:我如何确保有 CRL检查,但没有任何在线检查.
谢谢