2009-04-22 5 views
0

Я ищу способ получить цепочку сертификатов целевого сервера. У меня уже есть код, который позволяет мне захватить сертификат сервера, который представлен при подключении, но мне также хотелось бы, чтобы каждый суб-сертификат в цепочке полностью привязывался к корню.Как сохранить каждый сертификат в цепочке сертификатов

Вот код, который я использую для получения открытого ключа целевого сервера. К сожалению, я написал это назад, когда я только знал, VB.NET, но я предпочел бы иметь C# образцы ...

Private Function openSSLStream(ByRef server As ServerEntry) As SslStream 
    Dim sslStream As SslStream = Nothing 
    Dim newClient As New System.Net.Sockets.TcpClient 

    Try 
     newClient = New TcpClient 
     newClient.Connect(server.Name, server.Port) 
     sslStream = New SslStream(newClient.GetStream(), False, New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate), Nothing) 
     sslStream.AuthenticateAsClient(server.Name) 
     Return sslStream 
    Catch ex As Exception 
     Debug.WriteLine(ex.Message) 
     Return Nothing 
    Finally 
     If newClient.Connected Then newClient.Close() 
    End Try 
End Function 

Private Sub GetDetails(ByRef Server As ServerEntry) 
    Dim expcerdate As New Date 
    Dim newSSLstream As SslStream = openSSLStream(Server) 
    If Not newSSLstream Is Nothing Then 
     Dim newCertificate As New X509Certificate 
     Try 
      newCertificate = newSSLstream.RemoteCertificate() 
      expcerdate = CDate(newCertificate.GetExpirationDateString()) 
      Server.Subject = newCertificate.Subject 
      newCertificate.GetPublicKeyString() 
      Server.ValidFrom = newCertificate.GetEffectiveDateString() 
      Server.ValidTo = newCertificate.GetExpirationDateString() 
     Catch ex As Exception 
      Server.Subject = ex.Message 
     Finally 
      newSSLstream = Nothing 
      newCertificate = Nothing 
      expcerdate = Nothing 
     End Try 
    End If 
End Sub 

Конечным результатом этого является то, что у меня есть локальная копия открытого ключа, который я могу сохранить на локальный диск. Я хотел бы выполнить аналогичную задачу для каждого сертификата в цепочке, чтобы у меня был полный список открытых сертификатов для данного целевого сервера.

Для просмотра полного приложения, как оно есть сегодня, вы можете download it from my site.

ответ

0

Я немного поработал и нашел ответ, который мне нужен в вызове X509Chain и X509Certificate2. Я не буду публиковать весь код, но вот наиболее важная часть:

Dim cert2 As X509Certificate2 
Dim ch As New X509Chain() 
ch.Build(cert2) 

Dim element As X509ChainElement 

For Each element In ch.ChainElements 
    blob = element.Certificate.RawData() 
Next Element 
Смежные вопросы