1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
| using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.IO;
using System.Net;
using System.Collections;
using System.Security.Cryptography.X509Certificates;
/*Bouncy castle*/
using Org.BouncyCastle.Ocsp;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Crypto.Tls;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Asn1.Ocsp;
using Org.BouncyCastle.Utilities.Encoders;
using Org.BouncyCastle.X509;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ X509Store store = new X509Store(StoreName.My);
store.Open(OpenFlags.ReadOnly);
X509CertificateCollection certificates =
X509Certificate2UI.SelectFromCollection
(
store.Certificates,
"Liste des certificats",
"Veuillez sélectionner un certificat",
X509SelectionFlag.SingleSelection
);
//Close certificate store
store.Close();
//Retrieve selected certificate
if (certificates.Count == 0) //the user has caceled shoosing certificate
{
return;
}
X509Certificate2 certificate = (X509Certificate2)certificates[0];
//Convert X509Certificate2 to Org.BouncyCastle.X509.X509Certificate
X509CertificateParser certParser = new X509CertificateParser();
Org.BouncyCastle.X509.X509Certificate CertBouncy = certParser.ReadCertificate(certificate.RawData);
//FileStream fs = new FileStream(@"C:\AV.cer",FileMode.Open);
//Org.BouncyCastle.X509.X509Certificate CertBouncy = certParser.ReadCertificate(fs);
DoOcspRequest(new Uri("http://ocsp.eid.belgium.be"), CertBouncy.SerialNumber, CertBouncy);
}
private static byte[] getOcspPackage(BigInteger serialNr, Org.BouncyCastle.X509.X509Certificate cacert)
{
OcspReqGenerator gen = new OcspReqGenerator();
try {
CertificateID certId = new CertificateID(CertificateID.HashSha1, cacert, serialNr);
gen.AddRequest(certId);
gen.SetRequestExtensions(getExtentions());
OcspReq req;
req = gen.Generate();
return req.GetEncoded();
} catch (OcspException e) {
System.Console.WriteLine(e.Message);
} catch (IOException e) {
System.Console.WriteLine(e.Message);
}
return null;
}
private static X509Extensions getExtentions() {
byte[] nonce = new byte[16];
Hashtable exts = new Hashtable();
Org.BouncyCastle.Asn1.X509.X509Extension nonceext = new Org.BouncyCastle.Asn1.X509.X509Extension(false,new DerOctetString(nonce));
exts.Add(OcspObjectIdentifiers.PkixOcspNonce, nonceext);
return new X509Extensions(exts);
}
private byte[] DoOcspRequest(Uri uri, BigInteger serialNr, Org.BouncyCastle.X509.X509Certificate certificate)
{
byte[] response = null;
HttpWebRequest webRequest = null;
try
{
webRequest = (HttpWebRequest)WebRequest.Create(uri);
//Setting required HTTP Headers
webRequest.ContentType = "application/ocsp-request";
//webRequest.Accept = "application/ocsp-response";
webRequest.Method = "POST";
byte[] ocspPackage = getOcspPackage(serialNr, certificate);
webRequest.ContentLength = ocspPackage.Length;
//webRequest.KeepAlive = true;
Stream s = webRequest.GetRequestStream();
s.Write(ocspPackage, 0, ocspPackage.Length);
//Getting the response
HttpWebResponse res = (HttpWebResponse)webRequest.GetResponse();
//reading Content-Length Header
long contentLength = res.ContentLength;//normally about 3100 bytes
OcspResp OcspResponse = new OcspResp(res.GetResponseStream());
string statusOcsp = getOcspResponseStatus(OcspResponse.Status);
System.Console.WriteLine(statusOcsp);
BasicOcspResp brep;
brep = (BasicOcspResp)OcspResponse.GetResponseObject();
SingleResp[] singleResps = brep.Responses;
SingleResp singleResp = singleResps[0];
Object status = singleResp.GetCertStatus();
s.Close();
}
catch (Exception ex)
{
//exceptionhandling
}
return response;
}
private static string getOcspResponseStatus(int status)
{
string OcspResponseStatus = "";
switch (status)
{
case 0: OcspResponseStatus = "succesfull";
break;
case 1: OcspResponseStatus = "malformedRequest";
break;
case 2: OcspResponseStatus = "internalError";
break;
case 3: OcspResponseStatus = "tryLater";
break;
case 5: OcspResponseStatus = "sigRequired";
break;
case 6: OcspResponseStatus = "unauthorized";
break;
}
return OcspResponseStatus;
}
private static void getOcspResponse(Stream sResponse)
{
try
{
OcspResp response = new OcspResp(sResponse);
BasicOcspResp brep;
brep = (BasicOcspResp)response.GetResponseObject();
SingleResp[] singleResps = brep.Responses;
SingleResp singleResp = singleResps[0];
Object status = singleResp.GetCertStatus();
if (status == null)
{
System.Console.WriteLine("OCSP Response is GOOD");
}
else
{
System.Console.WriteLine("OCSP Response is REVOKED or UNKNOW");
}
}
catch (Exception e)
{
System.Console.WriteLine(e.Message);
}
} |
Partager