Até agora não encontrei uma especificação (RFC ou semelhante) para o formato de arquivo que usa o prefixo BEGIN RSA PRIVATE KEY e o sufixo END RSA PRIVATE KEY . Onde está definido? Existe um nome oficial para ele? Parece estar pelo menos relacionado à série de RFCs PEM.
Estou procurando informações de referência sobre os detalhes do tratamento de espaços em branco, detalhes de base64 , junção de chaves diferentes em um arquivo, etc.
Esta pergunta NÃO é sobre a codificação ASN da carga útil.
Comentários
- A especificação OpenPGP descreve formatos ASCII-Armor semelhantes.
- tls.mbed.org/kb/cryptography/asn1-key-structures-in- der-and-pem
- A maioria dos formatos PEM (também diferentes da chave privada RSA) estão documentados em RFC 7468: Codificações textuais de Estruturas PKIX, PKCS e CMS . Existem, por exemplo, algumas orientações sobre o tratamento de espaços em branco. Esse RFC basicamente observa esses detalhes variam de acordo com o analisador.
- Graças ao user4982: Este é o tipo de fonte que estou procurando. No entanto, RFC 7468 contém informações sobre o rótulo ” CHAVE PRIVADA CRIPTOGRAFADA “, mas não ‘ t para ” chave privada RSA “.
- PEM é definido em RFC 1421 que descreve o formato geral do cabeçalho, etc. Mas não consegui ‘ encontrar sobre o ” CHAVE PRIVADA RSA “. Este artigo de 1997 já menciona o uso do OpenSSL.
Resposta
Estou aqui porque estou me perguntando a mesma coisa que o OP.
PKCS # 1 (RFC 3447) define a estrutura ASN.1: RSAPrivateKey, permitindo a expressão de uma chave privada RSA apenas.
PKCS # 8 (RFC 5208) define a estrutura ASN.1: PrivateKeyInfo, permitindo a expressão de qualquer chave privada. (Para uma chave privada RSA, PrivateKeyInfo é algumas informações de pacote e uma reutilização de RSAPrivateKey de PKCS # 1).
PEM (Privacy Enhanced Mail), é um método extinto para email seguro. Porém, seu formato de contêiner foi emprestado para empacotar itens criptográficos.
RFC 7468 (Introdução): “ Por razões que basicamente se resumem a não coordenação ou desatenção, muitas bibliotecas PKIX, PKCS e CMS implementar uma codificação baseada em texto que seja semelhante – mas não idêntica à – codificação PEM . “
Que se lê como: Hum, as pessoas decidiram usar pedaços de PEM para empacotar seus arquivos criptográficos . Aqui, temos um grande esforço para tentar formalizar que …
Infelizmente, a RFC 7468 esclarece o pacote PKCS # 8 / PrivateKeyInfo como “BEGIN PRIVATE KEY”. Mas não o pacote de PKCS # 1 / RSAPrivateKey como “BEGIN RSA PRIVATE KEY”.
O pacote “BEGIN RSA PRIVATE KEY” às vezes é chamado de: “formato SSLeay” ou “formato tradicional” para chave privada. O que, pelo menos, nos dá um nome para esse formato, mas, como você, não consigo encontrar, e gostaria de receber, algo que se aproxima de uma descrição formal desse formato. Suspeito que isso não exista.
Comentários
-
I'm here, because, I'm asking myself the same question as the OP.
– – Para esclarecer: esta é sua resposta para a pergunta feita acima ou você está realmente se perguntando a mesma coisa?
Resposta
O formato do conteúdo base64 dentro:
-----BEGIN RSA PRIVATE KEY----- ...base64 encoded DER ASN.1 RSAPrivateKey... -----END RSA PRIVATE KEY-----
está documentado em RFC3447 – Apêndice A.1.2 – Sintaxe de chave privada RSA :
RSAPrivateKey ::= SEQUENCE { version Version, modulus INTEGER, -- n publicExponent INTEGER, -- e privateExponent INTEGER, -- d prime1 INTEGER, -- p prime2 INTEGER, -- q exponent1 INTEGER, -- d mod (p-1) exponent2 INTEGER, -- d mod (q-1) coefficient INTEGER, -- (inverse of q) mod p otherPrimeInfos OtherPrimeInfos OPTIONAL }
Você já sabe como codificar isso usando o DER sabor de ASN.1; e a questão é sobre como realmente gravar esses dados binários DER em um arquivo.
A próxima etapa está documentada em RFC 1421 – 4.3.2.4 Etapa 4 : Codificação para impressão
- eles documentam a codificação dos dados binários em base64
- codificando a saída como linhas de texto
- com cada linha ( exceto o último) contendo exatamente 64 caracteres imprimíveis
- e a linha final contendo 64 ou menos caracteres imprimíveis
Existe então o “Limite de encapsulamento” (EB), usado para delimitar mensagens PEM encapsuladas.
- a string pré-EB é:
-----BEGIN PRIVACY-ENHANCED MESSAGE-----
- a string pós-EB é:
-----END PRIVACY-ENHANCED MESSAGE-----
Era o padrão Privacy Enhanced Mail que usava:
- cinco hífens (
-----
) -
BEGIN
something
- cinco hífens (
-----
)
seguido por
- cinco hífens (
-----
) -
END
something
- cinco hífens (
-----
)
Essas convenções PEM foram transportadas para chave pública, chave privada e certificados, mas com texto alterado:
-----BEGIN RSA PUBLIC KEY----- ...base64 encoded DER ASN.1 RSAPublicKey... -----END RSA PUBLIC KEY-----
-----BEGIN RSA PRIVATE KEY----- ...base64 encoded DER ASN.1 RSAPrivateKey... -----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY----- ...base64 encoded DER ASN.1 SubjectPublicKeyInfo... -----END PUBLIC KEY-----
-----BEGIN PRIVATE KEY----- ...base64 encoded DER ASN.1 PrivateKeyInfo... -----END PUBLIC KEY-----
-----BEGIN CERTIFICATE----- ...base64 encoded DER ASNl.1 Certificate... -----END CERTIFICATE-----
Resposta
Sim. RFC7468 – Codificações textuais de estruturas PKIX, PKCS e CMS
Este documento articula as regras de fato pelas quais as implementações existentes operam e as define para que as implementações futuras possam interoperar.
Aqui “um trecho relevante:
10. Uma chave assimétrica e a codificação textual de informações da chave privada PKCS # 8
Estruturas de sintaxe de informações de chave privada PKCS # 8 não criptografadas (PrivateKeyInfo), renomeadas para Pacotes de chaves assimétricas (OneAsymmetricKey), são codificadas usando o rótulo “PRIVATE KEY”. Os dados codificados DEVEM ser um BER ( DER preferencial; consulte o Apêndice B) estrutura ASN.1 PrivateKeyInfo codificada conforme descrito em PKCS # 8 [RFC5208], ou uma estrutura OneAsymmetricKey conforme descrito em [RFC5958]. Os dois são semanticamente idênticos e podem ser distinguidos pelo número da versão.
-----BEGIN PRIVATE KEY----- MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgVcB/UNPxalR9zDYAjQIf jojUDiQuGnSJrFEEzZPT/92hRANCAASc7UJtgnF/abqWM60T3XNJEzBv5ez9TdwK H0M6xpM2q+53wmsN/eYLdgtjgBd3DBmHtPilCkiFICXyaA8z9LkJ -----END PRIVATE KEY-----
Comentários
- Estou perguntando sobre a ” CHAVE PRIVADA RSA “, não sobre ” PEDIDO DE CERTIFICADO “. A propósito, eu esperaria PKCS # 8 ou PKCS # 1, não PKCS # 10. O Capítulo 10 estaria mais perto. Mas não ‘ não especifica RSA no rótulo, portanto, faz sentido usar PKCS # 8 aqui. Como o algoritmo da chave seria especificado de forma redundante, poderia ser OK (e eu vi exemplos) colocar PKCS # 1 em uma ” RSA PRIVATE KEY ” arquivo.
- @Como eu já disse, estou procurando por ” chave privada RSA “, não para ” CHAVE PRIVADA “. Portanto, mesmo o capítulo 10 não é aplicável e RFC7468 é uma resposta errada.
- @Gustave I ‘ estou ciente de que você escreveu ” RSA PRIVATE KEY “, no entanto, especificar o formato da chave privada no cabeçalho é desnecessário e a especificação é relevante.
- O ABNF lê < < textualmsg = preeb * WSP (…) > > e < < preeb = ” —- -BEGIN ” rótulo ” —– ” (…) > >. Então, por que você acha que o cabeçalho é desnecessário?
- PKCS # 1 ( tools.ietf.org/html/rfc8017#apêndice-A.1.2 ) não ‘ t especifica qualquer codificação ASCII base64 e também não ‘ t especifica o
-----BEGIN RSA PRIVATE KEY-----
cabeçalho. PKCS # 8 também não ‘ t especifica qualquer codificação ASCII base64. O Capítulo 10 realmente especifica-----BEGIN PRIVATE KEY-----
. Você tem um link para um padrão que especifica o cabeçalho-----BEGIN RSA PRIVATE KEY-----
?