'Para quem quiser, segue um exemplo em VB.NET que gera a chave para certificados A3.
'Caso o certificado não possua CNPJ no subject, localizar pelo número serial.
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Collections
Imports System.Security
Imports System.Security.Cryptography
Imports System.Security.Cryptography.X509Certificates
Imports System.Security.Cryptography.Pkcs
Imports System.Security.Cryptography.Xml
Imports System.Xml
Imports System.Xml.Schema
Private Function GetChaveSAT(CNPJSoftwareHouse As String, CNPJEstbComercial As String) As String
'Procura pelo certificado da sofwarehouse no repositório do Windows
Dim cert As X509Certificate2 = FindCertOnStore(CNPJEstbComercial)
'Se não achar o certificado, finaliza
If cert Is Nothing Then
MessageBox.Show("Certificado não encontrado")
Return ""
End If
'Cria chave criptografada
Dim rsa As RSACryptoServiceProvider = cert.PrivateKey
Dim data As Byte() = Encoding.UTF8.GetBytes(CNPJSoftwareHouse + CNPJEstbComercial)
Dim sig As Byte() = rsa.SignData(data, "SHA256")
Dim base64sign As String = Convert.ToBase64String(sig)
Return base64sign
End Function
Private Function FindCertOnStore(CNPJ As String) As X509Certificate
Dim st As New X509Store(StoreLocation.CurrentUser)
st.Open(OpenFlags.ReadOnly)
For Each cert As X509Certificate In st.Certificates
If cert.Subject.IndexOf(CNPJ) > -1 Then
Return cert
End If
Next
Return Nothing
End Function
'E se for A1, mais fácil ainda:
Private Function GetChaveSAT(CNPJSoftwareHouse As String, CNPJEstbComercial As String) As String
'Cria o certificado A1
Dim cert As New X509Certificate2("C:\meucertificado.pfx", "senha1234")
'Se não achar o certificado, finaliza
If cert Is Nothing Then
MessageBox.Show("Certificado não encontrado")
Return ""
End If
'Cria chave criptografada
Dim rsa As RSACryptoServiceProvider = cert.PrivateKey
Dim data As Byte() = Encoding.UTF8.GetBytes(CNPJSoftwareHouse + CNPJEstbComercial)
Dim sig As Byte() = rsa.SignData(data, "SHA256")
Dim base64sign As String = Convert.ToBase64String(sig)
Return base64sign
End Function