如何在C#或Java握手期间读取ocsp装订响应

时间:2019-07-14 20:31:24

标签: java c# security ssl ocsp

有一个OCSP响应程序,服务器将与之通信并装订响应。客户端如何检查C#或Java中的装订响应。 Bouk Castle,Chiklat,原始库-他们称客户似乎有办法与OCSP响应者交谈,但看不到订书钉响应。

1 个答案:

答案 0 :(得分:1)

正如您已经正确提到的那样,装订是在握手期间完成的。我只知道如何在Bouncy Castle的C#端口中执行此操作,因为我正在实现基于BC的PKIX加密组件,该组件还考虑了OCSP,并且大大简化了BC调用(准备就绪时,我将在此处报告)发布Alpha版本,很可能是开源的。

首先,根据RFC6066,仅当您在Client-Hello中请求装订响应时,才发送装订响应。要启用此功能,您必须覆盖const State = () => { const [name, setName] = useState(""); const [age, setAge] = useState(0); const changeName = ({target}) => { setName(target.value) } const changeAge = ({target}) => { setAge(target.value) } const submitForm = () => console.log({name, age}) return ( <div className="home-grid"> <div> <p>Name: {name}</p> <p>Age: {age}</p> <hr/> <input type="text" value={name} onChange={changeName} /><br/> <input type="number" value={age} onChange={changeAge}/><br/> <button onClick = {submitForm}>Update State</button> </div> </div> ); } 中的GetClientExtensions(例如,当您继承自TlsClient时):

DefaultTlsClient

之后,如果支持,服务器将发送装订响应。 但是,该响应仅在握手期间可用,如果您看到Bouncy Castle的源代码,则会在您的 using BouncyTls = Org.BouncyCastle.Crypto.Tls; ... public override IDictionary GetClientExtensions() // Override in your TlsClient class { IDictionary clientExtensions = base.GetClientExtensions(); clientExtensions = BouncyTls.TlsExtensionsUtilities.EnsureExtensionsInitialised(clientExtensions); byte type = BouncyTls.CertificateStatusType.ocsp; var request = new BouncyTls.OcspStatusRequest(null, null); BouncyTls.TlsExtensionsUtilities.AddStatusRequestExtension(clientExtensions, new BouncyTls.CertificateStatusRequest(type, request)); return clientExtensions; } 实例中的CompleteHandshake上将其清除。 因此,您也必须在这里拦截:

TlsClientProtocol

我花了几个小时才了解充气城堡在这里做什么以及如何获取装订响应,尽管这样做的代码非常简单。 一个很好的起点总是找到对应的RFC并将字段与BC比较,因为Bouncy Castle在大多数情况下使用完全相同的标识符。

请注意另一点;为了符合TLS标准,如果状态条目显示证书已被吊销,请使用 protected override void CompleteHandshake() // Override in your TlsClientProtocol class { // After the handshake completed, we do not have any access to the handshake data anymore // (see TlsClientProtocol.CleanupHandshake). Therefore we must intercept here to gather information YourValidationOfTheOcspResponse(mCertificateStatus); // mCertificateStatus holds the response. It is cleared after the following call: base.CompleteHandshake(); } 来编写正确的错误记录(请参见RFC8446)。