Gerei uma chave privada usando libressl 3.0 usando curve secp521r1
.
openssl genpkey -aes128 -algorithm EC -pkeyopt ec_paramgen_curve:secp521r1 -pkeyopt ec_param_enc:named_curve
Tanto quanto eu sei, esta curva é a mesma que o ssh-keygen usa com ssh-keygen -t ecdsa -b 521
e da documentação que eu sei que o ssh-keygen agora usa aes128 para criptografar a chave privada.
O tamanho da chave privada libressl é 534
e o tamanho da chave ssh-keygen é 736
.
Minha pergunta é: o que o ssh-keygen faz extra que incrementa o tamanho da chave?
Além disso: ambos são permutáveis? uma chave privada gerada em um pode ser convertida para o outro?
TLDR: existem muitos formatos diferentes para arquivos de chave privada
E depende em parte da versão do OpenSSH, que você não forneceu.
Historicamente, exceto para o protocolo obsoleto versão 1 (e tipo de chave 'rsa1'), OpenSSH usado (a parte libcrypto de) OpenSSL para fazer a maioria de suas operações criptográficas - incluindo armazenar chaves privadas (ou pares de chaves em vigor) em arquivos, usando os formatos 'tradicionais' ou 'legados' definidos por SSLeay/OpenSSL . OpenSSL também suporta 'novos' (desde cerca de 1998!) Formatos PKCS8, que são (um pouco) mais seguros. Existem, portanto, 4 formatos PEM suportados pelo OpenSSL para "ECDSA" (mais exatamente estilo Weierstrass EC X9 que abrange X9.62 ECDSA e X9.63 ECDH) dos quais o OpenSSH gera apenas 2, mas (usando libcrypto) pode ler todos. Quando
ssh-keygen
criptografa arquivos no formato OpenSSL , as versões recentes usam AES-128-CBC, mas isso nem sempre foi verdade.A partir da versão 6.5 em 2014-01, o OpenSSH adicionou seu próprio 'novo' formato de arquivo , em parte para fornecer melhor segurança do que os formatos legados do OpenSSL (quando criptografados) e em parte para oferecer suporte ao novo algoritmo Ed25519, que o OpenSSL não suportava. de forma alguma.
ssh-keygen
tinha a opção-o
de solicitar um novo formato para qualquer tipo de chave diferente de ed25519 (ou rsa1), e você encontrará muitos Stack Qs e As dos últimos anos fazendo referência e geralmente recomendando essa opção. Arquivos de formato 'novo' são criptografados com AES256-CBC por padrão, que pode ser substituído por-Z ciphername
, mas a página do manual aparentemente não foi atualizada para nenhum deles. A partir da versão 7.8 em 2018-08, o OpenSSH agora tem como padrão o formato 'novo' para todos os tipos de chave, embora você possa usar-m pem
para solicitar o formato OpenSSL para qualquer coisa diferente de ed25519. Se você verificarman ssh-keygen
seu sistema (a menos que seja Windows), ele deve descrever um desses casos, provavelmente o último.(Também existe o formato PKCS12, também conhecido como PFX, que o OpenSSL pode usar para uma chave privada, mas normalmente é usado apenas para combinar uma chave privada (ou várias) com um ou mais certificados X.509 para essa(s) chave(s) , que é uma situação diferente e não aplicável ao SSH, que nunca usa certificados X.509. Outros programas ou sistemas usam outros formatos: 'comercial'/Tectia SSH tem formato próprio e PuTTY tem formato próprio PPK = PuTTY Private Key . Et cetera, et cetera, Yul Brynner. Todos estes são semanticamente equivalentes e, dadas as ferramentas adequadas, podem ser interconvertidas.)
Todos os formatos de chave privada usados pelo OpenSSH são do estilo PEM ; os dados binários são codificados em texto como base64 com linhas de cabeçalho e trailer no formato
então você pode dizer qual formato você tem apenas olhando para aquela linha de traços-BEGIN. Consulte near-crossdupes https://security.stackexchange.com/questions/39279/stronger-encryption-for-ssh-keys ou mais brevemente https://security.stackexchange.com/questions/129724/how-to-check- if-an-ssh-private-key-has-passphrase-or-not e https://security.stackexchange.com/questions/200935/how-do-i-determine-if-an-existing-ssh-private- chave-está-segura (minha).
As diferenças: o tamanho de 736 caracteres para uma chave ecdsa-p521 corresponde ao novo formato OpenSSH não criptografado - você tem certeza de que forneceu uma frase secreta? -- e 534 corresponde ao formato criptografado PKCS8 criado pelo OpenSSL 1.0.2, que é o IIRC quando o LibreSSL bifurcou. (OpenSSL 1.1.0 up altera a criptografia PKCS8 para usar HMAC-SHA256 em PBKDF2, o que torna o arquivo um pouco maior. OpenSSL 1.1.0 up também torna param_enc=named o padrão, então você não precisa mais especificá-lo.) O novo OpenSSH formato é maior que o formato PKCS8-enc principalmente porque, sem nenhuma razão óbvia, ele armazena o valor da chave pública (para ECDSA, um ponto de curva no formato X9.62) duas vezes -- uma vez na seção do arquivo especificada para chave pública e novamentena seção especificada para privatekey. Além disso, o formato OpenSSH tem a maioria de seus metadados como strings de texto e todos os campos de comprimento de 4 bytes, enquanto o PKCS8 (como os formatos legados do OpenSSL) usa ASN.1 com campos de comprimento variável na maioria apenas 1 byte e metadados principalmente binários, especialmente 'OIDs' para os algoritmos usados.)
Sim e não. Como observado, o OpenSSH usando OpenSSL pode ler (mas não gravar) PKCS8, portanto,
ssh-keygen
pode convertê-lo em OpenSSH-novo fazendo uma alteração nula, ou seja, 'alterando' a senha para o valor existente; de 6,5 a 7,7 você deve especificar-o
e de 7,8 em diante é o padrão. Indo para o outro lado,ssh-keygen
pode converter para OpenSSL legado, mas não diretamente para PKCS8, você precisa usaropenssl
para fazer isso, explicitamente compkcs8 -topk8
ou em 1.0.0 acima (que agora deve ser todo mundo e definitivamente todo LibreSSL) apenaspkey
. (O primeiro padrão é criptografado e o segundo não criptografado, mas ambos podem ser substituídos.)