Saltar al contenido

¿Cómo crear un snk desde pfx / cer?

Esta es el arreglo más acertada que encomtrarás compartir, sin embargo mírala detenidamente y analiza si se puede adaptar a tu trabajo.

Solución:

Una pequeña aclaración sobre los tipos de archivos mencionados:

  • .cer-los archivos son certificados X.509
  • .pfx-los archivos son certificados X.509 cifrados que utilizan un sistema simétrico key, consulte también PKCS # 12 (Wikipedia)
  • .snk-los archivos solo contienen el RSA key (público / privado o solo público)

No importa si firmas una asamblea usando .pfx-archivos o .snk-files, obtendrá un nombre fuerte de cualquier manera. Almacenamiento de RSA key como un certificado encriptado (.pfx) es, por supuesto, más seguro que almacenar solo los archivos sin cifrar key (.snk).

Puede extraer fácilmente el key de esos archivos en código usando clase System.Security.Cryptography.X509Certificates.X509Certificate2.

Extraer key desde .pfx:

/// 
/// Converts .pfx file to .snk file.
/// 
/// .pfx file data.
/// .pfx file password.
/// .snk file data.
public static byte[] Pfx2Snk(byte[] pfxData, string pfxPassword)

    // load .pfx
    var cert = new X509Certificate2(pfxData, pfxPassword, X509KeyStorageFlags.Exportable);

    // create .snk
    var privateKey = (RSACryptoServiceProvider)cert.PrivateKey;
    return privateKey.ExportCspBlob(true);

Usar privateKey.ExportCspBlob(false) para extraer público key ¡solo! (por ejemplo, para la firma diferida de asambleas)

Para generar un archivo snk desde un pfx:

sn -p keypair.pfx key.snk

Siempre he sido un fanático de usar archivos snk sobre archivos .pfx, simplemente parecen tener menos errores.

Este es el mismo método proporcionado por @Sir Kill A Lot en su respuesta, pero convertido a un script de PowerShell (pfx2snk.ps1).

Param(
    [Parameter(Mandatory=$True,Position=1)]
    [string] $pfxFilePath,
    [string] $pfxPassword
)

# The path to the snk file we're creating
[string] $snkFilePath = [IO.Path]::GetFileNameWithoutExtension($pfxFilePath) + ".snk";

# Read in the bytes of the pfx file
[byte[]] $pfxBytes = Get-Content $pfxFilePath -Encoding Byte;

# Get a cert object from the pfx bytes with the private key marked as exportable
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2(
    $pfxBytes,
    $pfxPassword,
    [Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable);

# Export a CSP blob from the cert (which is the same format as an SNK file)
[byte[]] $snkBytes = ([Security.Cryptography.RSACryptoServiceProvider]$cert.PrivateKey).ExportCspBlob($true);

# Write the CSP blob/SNK bytes to the snk file
[IO.File]::WriteAllBytes($snkFilePath, $snkBytes);

Simplemente ejecute ese script que proporciona la ruta del archivo pfx y la contraseña y creará un archivo snk en el mismo directorio que el archivo pfx (con el mismo nombre que no sea la extensión).

powershell.exe -File pfx2snk.ps1 -pfxFilePath cert.pfx -pfxPassword "pfx password"

O, si su pfx no tiene contraseña (vergüenza, vergüenza):

powershell.exe -File pfx2snk.ps1 cert.pfx

Y, si tiene la mala suerte de estar trabajando en un entorno en el que no permiten que se ejecuten los scripts de PowerShell (es decir, solo sesiones interactivas de PowerShell), puede ejecutar este feo trazador de líneas desde una línea de comando cmd.exe estándar ( reemplazando las rutas de archivo y la contraseña pfx según sea necesario).

powershell.exe -Command "[IO.File]::WriteAllBytes('SnkFilePath.snk', ([Security.Cryptography.RSACryptoServiceProvider](New-Object System.Security.Cryptography.X509Certificates.X509Certificate2((Get-Content 'PfxFilePath.pfx' -Encoding Byte), 'PfxPassword', [Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)).PrivateKey).ExportCspBlob($true));"

De hecho, utilizo esa frase como una parte estándar de mi proceso de compilación previa de Visual Studio para automatizar el proceso de uso de la misma keys de nuestros certificados de firma authenticode (archivo pfx) para firmas de nombres seguros. Eso no es un requisito, pero me parece que tiene sentido que sean iguales y eso alimenta mis tendencias TOC.

(Utilizo un archivo snk en lugar del pfx original porque he tenido la experiencia “con errores” al usar archivos pfx para la firma de nombres seguros que @punkcoder mencionó en su respuesta)

Y, si está interesado, tengo algo como lo siguiente como parte de mi proceso de compilación posterior en Visual Studio para agregar la firma authenticode a la salida del proyecto (en las configuraciones del proyecto “Versión” de todos modos).

powershell.exe -Command "Set-AuthenticodeSignature -FilePath '$(TargetPath)' -Certificate '$(SolutionDir)MyCert.pfx' -TimestampServer http://timestamp.verisign.com/scripts/timstamp.dll -HashAlgorithm sha256;"

Más adelante puedes encontrar las referencias de otros creadores, tú además tienes la libertad de mostrar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *