Este documento descreve os formatos de dados e as codificações mais comuns de infraestrutura de chave pública (PKI).
A Cisco recomenda que você tenha conhecimento destes tópicos:
Este documento não se restringe a versões de software e hardware específicas.
The information in this document was created from the devices in a specific lab environment. All of the devices used in this document started with a cleared (default) configuration. If your network is live, make sure that you understand the potential impact of any command.
Consulte as Convenções de Dicas Técnicas da Cisco para obter informações sobre convenções de documentos.
A notação de sintaxe abstrata um (ASN.1) é uma linguagem formal para a definição de tipos de dados e valores, e como esses tipos de dados e valores são usados e combinados em várias estruturas de dados. O objetivo do padrão é definir a sintaxe abstrata das informações sem restringir a forma como as informações são codificadas para transmissão.
Aqui está um exemplo extraído do RFC X.509:
Version ::= INTEGER { v1(0), v2(1), v3(2) }
CertificateSerialNumber ::= INTEGER
Validity ::= SEQUENCE {
notBefore Time,
notAfter Time }
Time ::= CHOICE {
utcTime UTCTime,
generalTime GeneralizedTime }
Consulte estes documentos dos sites de padrões da União Internacional de Telecomunicações (ITU-T):
Pesquisa de recomendações ITU-T - Pesquisa por X.509 em Rec. ou padrão com Idioma definido como ASN.1.
A ITU-T definiu uma maneira padrão de codificar estruturas de dados descritas em ASN.1 em dados binários. O X.690 define BER (Basic Encoding Rules, regras básicas de codificação) e seus dois subconjuntos, CER (Canonical Encoding Rules, regras canônicas de codificação) e DER (Distinguished Encoding Rules, regras de codificação distintas). Todos os três são baseados em campos de dados de tamanho de tipo compactados em uma estrutura hierárquica, que é criada a partir de SEQUÊNCIAS, SETs e CHOICEs, com estas diferenças:
Exemplo: Em DER, o valor de 20 bits 1010 1011 1100 1101 1110 é codificado como:
0x03
(bitstring)0x04
(bytes)0x04 ABCDE0
0x030404ABCDE0
O 04
inicial significa que os últimos 4 bits (igual ao 0
dígito final) do valor codificado devem ser descartados porque o valor codificado não termina em um limite de byte.
Consulte estes documentos do site de padrões TU-T:
No site da Wikipédia, consulte estes documentos:
O Cisco IOS, o Adaptive Security Appliance (ASA) e outros dispositivos exibem o conteúdo DER como um dump hexadecimal com o comando show running-config. Esta é a saída:
crypto pki certificate chain root
certificate ca 01
30820213 3082017C A0030201 02020101 300D0609 2A864886 F70D0101 04050030
1D310C30 0A060355 040B1303 54414331 0D300B06 03550403 1304726F 6F74301E
170D3039 30373235 31313436 33325A17 0D313230 37323431 31343633 325A301D
...
Esse tipo de despejo hexadecimal pode ser convertido de volta ao DER de várias maneiras. Por exemplo, você pode remover os caracteres de espaço e canalizá-los para o programa xxd:
$ cat ca.hex | tr -d ' ' | xxd -r -p -c 32 | openssl x509 -inform der -text -noout
Outra maneira fácil é usar este script Perl :
#!/usr/bin/perl
foreach (<>) {
s/[^a-fA-F0-9]//g;
print join("", pack("H*", $_));
}
$ perl hex2der.pl < hex-file.txt > der-file.der
Além disso, uma forma compacta de converter dumps de certificado, cada um copiado anteriormente manualmente para um arquivo com extensão .hex, de uma linha de comando bash como mostrado aqui:
for hex in *.hex; do
b="${hex%.hex}"
hex2der.pl < "$hex" > "$b".der
openssl x509 -inform der -in "$b".der > "$b".pem
openssl x509 -in "$b".pem -text -noout > "$b".txt
done
Cada arquivo resulta em:
A codificação Base64 representa os dados binários com apenas 64 caracteres imprimíveis (A-Za-z0-9+/
), de forma semelhante à codificação. Na conversão de binário para Base64, cada bloco de 6 bits dos dados originais é codificado em um caractere ASCII imprimível de 8 bits com uma tabela de conversão. Portanto, o tamanho dos dados após a codificação aumentou 33% (tempos de dados 8 divididos por 6 bits, é igual a 1,333).
Um buffer de 24 bits é usado para a conversão de três (3) grupos de oito (8) bits em quatro (4) grupos de seis (6) bits. Portanto, um (1) ou dois (2) bytes de preenchimento podem ser necessários no final do fluxo de dados de entrada. O preenchimento é indicado no final dos dados codificados em Base64, por um sinal de igual (=)
para cada grupo de oito (8) bits de enchimento adicionados à entrada durante a codificação.
Consulte este exemplo da Wikipédia.
Consulte as informações mais recentes no RFC 4648: Codificações de dados Base16, Base32 e Base64.
O Privacy Enhanced Mail (PEM) é um padrão completo de PKI da Internet Engineering Task Force (IETF) para trocar mensagens seguras. Ela não é mais usada como tal, mas sua sintaxe de encapsulamento foi amplamente emprestada para formatar e trocar dados relacionados a PKI codificados na Base64.
PEM RFC 1421, seção 4.4: Mecanismo de encapsulamento, define as mensagens PEM como delimitadas pelos limites de encapsulamento (EBs), que são baseados no RFC 934, com este formato:
-----BEGIN PRIVACY-ENHANCED MESSAGE-----
Header: value
Header: value
...
Base64-encoded data
...
-----END PRIVACY-ENHANCED MESSAGE-----
Na prática atual, quando os dados formatados por PEM são distribuídos, esse formato de limite é usado:
-----BEGIN type-----
...
-----END type-----
o tipo pode estar com outras chaves ou certificados, como:
CHAVE PRIVADA RSA
CHAVE PRIVADA CRIPTOGRAFADA
CERTIFICADO
CERTIFICATE REQUEST
CRL X509
Note: Embora os RFC não tornem isso obrigatório, o número de traços dianteiros e finais (-
) nos EBs é significativo e deve ser sempre cinco (5). Caso contrário, alguns aplicativos, como o OpenSSL, ficam bloqueados na entrada. Por outro lado, outros aplicativos, como o Cisco IOS, não exigem EBs.
Consulte os RFCs mais recentes para obter mais informações:
O X.509 é um subconjunto do X.500, que é uma especificação ITU estendida sobre a Interconexão de sistemas abertos. Ele trata especificamente de certificados e chaves públicas e foi adaptado como um padrão da Internet pela IETF. O X.509 fornece uma estrutura e sintaxe, expressas no RFC com notação ASN.1, para armazenar informações de certificado e listas de revogação de certificado.
Em um PKI X.509, uma CA emite um certificado que vincula uma chave pública, por exemplo: uma chave Rivest-Shamir-Adleman (RSA) ou Digital Signature Algorithm (DSA) para um nome distinto (DN) específico, ou para um nome alternativo, como um endereço de e-mail ou nome de domínio totalmente qualificado (FQDN). O DN segue a estrutura nos padrões X.500. Aqui está um exemplo:
CN=nome comum,OU=unidade organizacional,O=organização,L=local,C=país
Devido à definição ASN.1, os dados X.509 podem ser codificados em DER para serem trocados na forma binária e, opcionalmente, convertidos em Base64/PEM para meios de comunicação baseados em texto, como colagem de cópia em um terminal.
Os PKCS (Public-Key Cryptography Standards, Padrões de Criptografia de Chave Pública) são especificações dos RSA Labs que evoluíram parcialmente para padrões do setor. Os mais frequentemente encontrados abordam estes tópicos; no entanto, nem todos lidam com formatos de dados.
PKCS#1 (RFC 3347) - Abrange os aspectos de implementação da criptografia baseada em RSA (primitivos de criptografia, esquemas de criptografia/assinatura, sintaxe ASN.1).
PKCS#5 (RFC 2898) - Abrange derivação de chave baseada em senha.
PKCS#7 (RFC 2315) e S/MIME RFC 3852 - Define uma sintaxe de mensagem para transmitir dados assinados e criptografados e certificados relacionados. Frequentemente usado simplesmente como um contêiner para certificados X.509.
PKCS#8 - Define uma sintaxe de mensagem para transportar texto claro ou pares de chaves RSA criptografados.
PKCS#9 (RFC 2985) - Define classes de objetos e atributos de identidade adicionais.
PKCS#10 (RFC 2986) - Define uma sintaxe de mensagem para solicitações de assinatura de certificado (CSRs). Um CSR é enviado por uma entidade a uma CA e contém as informações a serem assinadas pela CA, como informações de chave pública, identidade e atributos adicionais.
PKCS#12 - Define um contêiner para dados de PKI relacionados a embalagens (normalmente, par de chaves de entidade + certificado de entidade + certificados CA raiz e intermediários) em um único arquivo. É uma evolução do formato do Intercâmbio de informações pessoais (PFX) da Microsoft.
Consulte estes recursos: