在过去的几天里,我一直在试着在Android上实施OCSP验证.
到目前为止,iOS已经很容易实现,但对于Android,我遇到的每一条信息都无法正常工作.我一直在使用我的客户的API端点和 这个网站来运行证书撤销测试,到目前为止,我还没有幸运地在我的Android应用程序中检测到已撤销的证书.我正在使用OKHTTPClient.这是我验证认证撤销的方法
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
assert (chain != null);
if (chain == null) {
throw new IllegalArgumentException(
"checkServerTrusted: X509Certificate array is null");
}
assert (chain.length > 0);
if (!(chain.length > 0)) {
throw new IllegalArgumentException(
"checkServerTrusted: X509Certificate is empty");
}
if (VERIFY_AUTHTYPE) {
assert (null != authType && authType.equalsIgnoreCase(AUTH_TYPE));
if (!(null != authType && authType.equalsIgnoreCase(AUTH_TYPE))) {
throw new CertificateException(
"checkServerTrusted: AuthType is not " + AUTH_TYPE);
}
}
if(chain[0]!=null){
try {
X509Certificate …Run Code Online (Sandbox Code Playgroud) 如果仅使用客户端的java.security.cert.X509Certificate,如何使用OCSP手动检查java中的证书撤销状态?我看不清楚这样做的明确方法.
或者,我可以让tomcat自动为我做,你怎么知道你的解决方案是真的?
我正在试图弄清楚在使用Security.Framework验证证书时证书的撤销时的iOS政策.我在iOS的文档中找不到相关信息.在我正在进行的iPad项目的背景下,有理由要求检查某些证书的撤销状态.有关如何使用Security.Framework在证书验证期间强制CRL/OCSP检查的任何想法?或者我是否需要"退回"OpenSSL才能实现这一目标?
似乎在Mac OS X 10.6 CRL/OCSP检查也是可选的,必须通过Keychain Access手动打开.
马亭
有人可以帮助我以下吗?
RFC2560定义何时可以接受OCSP响应者证书(签署响应):
1. Matches a local configuration of OCSP signing authority for the
certificate in question; or
2. Is the certificate of the CA that issued the certificate in
question; or
3. Includes a value of id-ad-ocspSigning in an ExtendedKeyUsage
extension and is issued by the CA that issued the certificate in
question."
Run Code Online (Sandbox Code Playgroud)
我的问题是:
如果OCSP响应者的证书是由验证路径的信任锚签名的,它是否也被认为是被接受的?
我的印象应该是,但这并没有在RFC上明确说明,也没有找到明确的参考.
从我对RFC的阅读来看,即使它是由TA签署的,它仍然对OCSP响应无效.
感谢任何帮助
注意:我正在使用java,以防万一
更新:
在RFC的2.2节中:
所有明确的响应消息都应进行数字签名.
用于签署响应的密钥必须属于以下之一:- 颁发相关证书 的CA--
请求者信任其公钥的可信响应者
- CA指定响应者(授权响应者),持有由CA直接颁发的特殊标记证书,表明响应者可能发布该CA的OCSP响应
第2点对我来说似乎含糊不清.
它可能意味着:
a)任何PK可信任,因此Trust Anchor是可接受的
或
b)在第一个引用中具有point(1)的含义,这意味着预先配置证书(any)以信任为OCSP响应者,例如在这里完成:
Security.setProperty("ocsp.responderCertSubjectName",ocspCert.getSubjectDN().getName));
List<X509Certificate> list = new …Run Code Online (Sandbox Code Playgroud) 我使用Bouncy castle API创建了一个OCSP客户端.我无法从OCSP响应中找到证书状态(说是否已撤销).resp.getCertStatus()返回的值始终为null.这就是我创建OCSP请求的方式.
private OCSPReq generateOCSPRequest(X509Certificate issuerCert, BigInteger serialNumber)
throws CertificateVerificationException {
//Add provider BC
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
try {
// CertID structure is used to uniquely identify certificates that are the subject of
// an OCSP request or response and has an ASN.1 definition. CertID structure is defined in RFC 2560
CertificateID id = new CertificateID(CertificateID.HASH_SHA1, issuerCert, serialNumber);
// basic request generation with nonce
OCSPReqGenerator generator = new OCSPReqGenerator();
generator.addRequest(id);
// create details for nonce extension. The nonce extension is …Run Code Online (Sandbox Code Playgroud) 我一直试图在不同的时刻使用OCSP和CRL检查iOS 7.0中的X.509证书撤销状态,并且评估返回kSecTrustResultUnspecified(这意味着证书是可信的),而不用实际检查OCSP或CRL源,当我通过链中的所有证书.我在下面提出了我认为相关的任何代码,请帮忙!
谢谢!
PS:ocspOnly和crlOnly是布尔值,表示是否只使用任何撤销检查方法; certs是一个NSArray,包含除锚证书之外的所有链中的证书; 之前正确设置了锚证书.
int evaluationMethod = kSecRevocationRequirePositiveResponse;
if (ocspOnly) {
evaluationMethod |= kSecRevocationOCSPMethod;
} else if (crlOnly) {
evaluationMethod |= kSecRevocationCRLMethod;
} else {
evaluationMethod |= kSecRevocationUseAnyAvailableMethod;
}
if ((status = SecTrustCreateWithCertificates((__bridge CFArrayRef)certs, SecPolicyCreateRevocation(evaluationMethod), &trust)) != errSecSuccess) {
NSLog(@"Failed to create trust with certificate and policy: %ld", status);
return NO;
}
if ((status = SecTrustSetNetworkFetchAllowed(trust, YES)) != errSecSuccess) {
NSLog(@"Failed to activate network fetch: %ld", status);
}
status = SecTrustEvaluate(trust, &trustResult);
if (status != errSecSuccess) {
NSLog(@"Failed …Run Code Online (Sandbox Code Playgroud) 据我所知,OCSP 只提供明确的请求和响应签名方式([RFC2560,第 7 页] 请求,[RFC2560,第 8 页] 响应),但它没有提及加密。通过 SSL/TLS 运行 OCSP 以保证其机密性是否是典型的(或者甚至可能,我认为当然是这样)?
谢谢。
如何使用 Python 请求库向 EJBCA OSCP 响应程序发出简单的证书吊销状态请求?
例子:
# Determine if certificate has been revoked
ocsp_url = req_cert.extensions[2].value[0].access_location.value
ocsp_headers = {"whatGoes: here?"}
ocsp_body = {"What goes here?"}
ocsp_response = requests.get(ocsp_url, ocsp_headers, ocsp_body)
if (ocsp_response == 'revoked'):
return func.HttpResponse(
"Certificate is not valid (Revoked)."
)
Run Code Online (Sandbox Code Playgroud) 我不是OpenSSL专家,但我一直在尝试编写一些代码来处理连接到SSL安全服务器的客户端的OCSP装订.我对OCSP的理解是,它用于证明所提供的证书尚未被撤销,这意味着我不需要处理管理发行人发布的CRL.
我使用SSL_CTX_set_verify来设置回调以处理证书的验证(好吧,处理OpenSSL自己的内部验证过程的异常.我假设,但是找不到证明此内部过程不检查证书撤销状态的正面证据),并且当前我的代码利用这个机会来检查发行者是否受信任(如果没有,那么发行人的发行人是受信任的,依此类推,直到链被信任或被拒绝),以及其他东西,例如证书未过期.(这也可能已经检查过,但这对我的问题并不重要).
我修改了我的代码,添加了
SSL_set_tlsext_status_type(<the ssl object>, TLSEXT_STATUSTYPE_ocsp);
SSL_CTX_set_tlsext_status_cb(<the context>, ssl_cb_ocsp_verify);
Run Code Online (Sandbox Code Playgroud)
然后我可以得到响应并在处理程序中检查它.到现在为止还挺好!
但奇怪的是,在获得SSL_CTX_set_verify处理程序后,我得到了OCSP回调.对我来说(诚然天真)的想法,这意味着我有两个选择:
1)使用CRL或自己的OCSP请求检查验证回调中的撤销状态.如果我这样做,那么在OCSP回调中做任何事都没有意义,因为我已经确定了证书的撤销状态2)不要检查验证回调中的撤销状态,并希望疯狂地认为OCSP处理程序是调用.
我注意到如果来自服务器的响应不包含装订的OCSP消息,则在验证处理程序之前调用OCSP处理程序.所以有一种可能性是我最初将某个标志'no_ocsp'设置为0,然后如果我得到没有附加消息的OCSP回调,则将其设置为1.然后在验证处理程序中我可以检查这个以尝试确定是否稍后将调用OCSP处理程序.这似乎有点像一辆汽车,当任何人接近时解锁自己,然后如果接近的人把错误的钥匙插入,它会锁定自己 - 换句话说,它肯定不是"正确"的安全方式?!
因此,我必须对如何使用OCSP,OpenSSL或两者都有一些基本的误解!我究竟做错了什么?
(我已经看到类似的问题解释了如何获取 OCSP装订的消息,但我的问题是关于如何以合理的方式实际使用它,给定回调的顺序.要明确:我可以获得OCSP_RESPONSE任何问题)
我正在使用Nginx创建一个安全的连接; 当我撤销客户端证书时,我也可以通过https连接到Nginx,我知道我应该配置ssl_crl指令,但我想使用OCSP来验证客户端证书,我该怎么办?我发现Nginx使用OpenSSL库来建立ssl连接,我应该用openssl.cnf文件做些什么?