我正在使用 BouncyCastle 和我知道其有效的证书发出 OCSP 请求。我的问题是我得到了一个未知的证书状态。我知道这意味着服务器出了问题,它可以返回证书的状态。
在 BouncyCastle 框架中,有没有办法获得错误描述、异常或某种消息,可以帮助我弄清楚为什么服务器无法处理此证书的验证?
我正在使用 BouncyCastle 和我知道其有效的证书发出 OCSP 请求。我的问题是我得到了一个未知的证书状态。我知道这意味着服务器出了问题,它可以返回证书的状态。
在 BouncyCastle 框架中,有没有办法获得错误描述、异常或某种消息,可以帮助我弄清楚为什么服务器无法处理此证书的验证?
在RFC6960 OCSP 协议中定义 OCSP 响应必须为 OCSP 请求中包含的每个证书添加以下信息:
...
请求中每个证书的响应包括:o 为其提供撤销状态信息的证书的标识符(即目标证书);
o 证书的撤销状态(良好、已撤销或未知);如果被吊销,则表明证书被吊销的时间,以及(可选)被吊销的原因;
o 响应的有效期;和
o 可选扩展。...
正如 RFC 中所定义的,仅当证书状态是revoked
附加信息时才添加到 OCSP 响应(时间和可选的撤销原因),当状态是每个good
或unknown
不添加其他信息时。
您可以CertStatus
在本文档的 ASN.1 定义中看到:
CertStatus ::= CHOICE {
good [0] IMPLICIT NULL,
revoked [1] IMPLICIT RevokedInfo,
unknown [2] IMPLICIT UnknownInfo }
RevokedInfo ::= SEQUENCE {
revocationTime GeneralizedTime,
revocationReason [0] EXPLICIT CRLReason OPTIONAL }
UnknownInfo ::= NULL
因此,即使 BouncyCastle 有办法解析此 OCSP 响应信息,您也无法获得unknown
证书的其他详细信息。如果您检查org.bouncycastle.asn1.ocsp.CertStatus
代表此结构的类,您会看到相同的结果:
public CertStatus(ASN1TaggedObject choice)
{
this.tagNo = choice.getTagNo();
switch (choice.getTagNo())
{
case 0:
value = new DERNull();
break;
case 1:
value = RevokedInfo.getInstance(choice, false);
break;
case 2:
value = new DERNull();
}
}
就像规范所说的那样,good(0)
并unknown(2)
具有NULL
作为信息,并且仅用于revoked(1)
添加更多信息。
无论如何,如果您至少在 java 中对 BouncyCastle 感到好奇(我想在 C# 版本中也是如此),有类可以使用 OCSP 协议,请查看org.bouncycastle.asn1.ocsp
包中的类,这些类代表定义的 ASN.1 格式的OCSPRequest
元素OCSPResponse
在 RFC6960 中。
希望这可以帮助,