これは、WCF の拡張機能 (拡張機能の概要)を通じて実現できます。
特定の例 (方法: カスタム証明書検証ツールを使用するサービスを作成する)
その情報と、この StackoverFlow の投稿から収集した情報を使用して、証明書の有効性をチェックし、それが特定の認証局からのものであることを確認するサービスを作成しました。
コード:
public class CustomX509CertificateValidator : X509CertificateValidator
{
public override void Validate(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate)
{
var ch = new X509Chain();
//RevocationMode Enumeration
//http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509revocationmode.aspx
ch.ChainPolicy.RevocationMode = X509RevocationMode.Online;
//RevocationFlag Enumeration
//http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509revocationflag.aspx
ch.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
//The time span that elapsed during online revocation verification or downloading the
//certificate revocation list (CRL)
ch.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(1000);
//VerificationFlags Enumeration
//http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509verificationflags.aspx
ch.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;
//The time that the certificate was verified expressed in local time
ch.ChainPolicy.VerificationTime = DateTime.Now;
ch.Build(certificate);
//Check to see if the CA is a specific one
if (ch.ChainElements[ch.ChainElements.Count - 1].Certificate.IssuerName.Name != "CN=Something, OU=PKI...,")
{
throw new SecurityTokenValidationException("Certificate was not issued by a trusted issuer");
}
foreach (X509ChainStatus s in ch.ChainStatus)
{
string str = s.Status.ToString();
Console.WriteLine("str: " + str);
}
//Check to see if the current certificate is revoced in the current system (does this not happen in the above?
X509Store store = new X509Store(StoreName.Disallowed, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
bool isRevoked = store.Certificates.Contains(certificate);
store.Close();
if (isRevoked)
{
throw new SecurityTokenValidationException("Certificate is revoked");
}
if (certificate.Verify() == false)
{
throw new SecurityTokenValidationException("Certificate cannot be verified");
}
}
}
web.config
<behaviors>
<serviceBehaviors>
<behavior name="secureHttpBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceCredentials>
<serviceCertificate findValue="00 b7 70" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySerialNumber"/>
<clientCertificate>
<authentication certificateValidationMode="Custom"
customCertificateValidatorType="WcfWebServer.CustomX509CertificateValidator, WcfWebServer"/>
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>