Как сохранить каждый сертификат в цепочке сертификатов - PullRequest
0 голосов
/ 22 апреля 2009

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

Вот код, который я использую для получения открытого ключа целевого сервера. К сожалению, я написал это, когда знал только 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

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

Чтобы посмотреть приложение полностью, как сегодня, вы можете скачать его с моего сайта .

1 Ответ

0 голосов
/ 24 апреля 2009

Я немного покопался и нашел нужный мне ответ в вызове 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...