L'obtention de la clé privée RSA de PEM, Encodé en BASE64 fichier de clé privée
J'ai un fichier de clé privée (PEM encodées en BASE64). Je veux l'utiliser ailleurs à déchiffrer quelques autres données.À l'aide de Java j'ai essayé de lire le fichier et de décoder les données codées en BASE64 en elle...
C'est l'extrait de code que j'ai essayé....
import java.io.*;
import java.nio.ByteBuffer;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import com.ibm.crypto.fips.provider.RSAPrivateKey;
import com.ibm.misc.BASE64Decoder;
public class GetPrivateKey {
public static RSAPrivateKey get() throws Exception {
File privateKeyFile = new File("privatekey.key");
byte[] encodedKey = new byte[(int) privateKeyFile.length()];
new FileInputStream(privateKeyFile).read(encodedKey);
ByteBuffer keyBytes = new BASE64Decoder().decodeBufferToByteBuffer(encodedKey.toString());
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(keyBytes.array());
KeyFactory kf = KeyFactory.getInstance("RSA", "IBMJCEFIPS");
RSAPrivateKey pk = (RSAPrivateKey) kf.generatePrivate(privateKeySpec);
return pk;
}
public static void main(String[] args) throws Exception {
PrivateKey privKey = FormatMePlease.get();
System.out.println(privKey.toString());
}
}
J'obtiens les erreurs suivantes
Exception in thread "main" java.security.spec.InvalidKeySpecException: Inappropriate key specification: DerInputStream.getLength(): lengthTag=127, too big.
at com.ibm.crypto.fips.provider.RSAKeyFactory.b(Unknown Source)
at com.ibm.crypto.fips.provider.RSAKeyFactory.engineGeneratePrivate(Unknown Source)
at java.security.KeyFactory.generatePrivate(Unknown Source)
at GetPrivateKey.get(GetPrivateKey.java:24)
at GetPrivateKey.main(GetPrivateKey.java:29)
Le contenu du fichier "privatekey.la touche"
-----BEGIN RSA PRIVATE KEY-----
MIIEuwIBADANBgkqhkiG9w0BAQEFAASCBKUwggShAgEAAoIBAF53wUbKmDHtvfOb8u1HPqEBFNNF
csnOMjIcSEhAwIQMbgrOuQ+vH/YgXuuDJaURS85H8P4UTt6lYOJn+SFnXvS82E7LHJpVrWwQzbh2
QKh13/akPe90DlNTUGEYO7rHaPLqTlld0jkLFSytwqfwqn9yrYpM1ncUOpCciK5j8t8MzO71LJoJ
g24CFxpjIS0tBrJvKzrRNcxWSRDLmu2kNmtsh7yyJouE6XoizVmBmNVltHhFaDMmqjugMQA2CZfL
rxiR1ep8TH8IBvPqysqZI1RIpB/e0engP4/1KLrOt+6gGS0JEDh1kG2fJObl+N4n3sCOtgaz5Uz8
8jpwbmZ3Se8CAwEAAQKCAQAdOsSs2MbavAsIM3qo/GBehO0iqdxooMpbQvECmjZ3JTlvUqNkPPWQ
vFdiW8PsHTvtackhdLsqnNUreKxXL5rr8vqi9qm0/0mXpGNi7gP3m/FeaVdYnfpIwgCe6lag5k6M
yv7PG/6N8+XrWyBdwlOe96bGohvB4Jp2YFjSTM67QONQ8CdmfqokqJ8/3RyrpDvGN3iX3yzBqXGO
jPkoJQv3I4lsYdR0nl4obHHnMSeWCQCYvJoZ7ZOliu/Dd0ksItlodG6s8r/ujkSa8VIhe0fnXTf0
i7lqa55CAByGN4MOR0bAkJwIB7nZzQKurBPcTAYJFFvAc5hgMnWT0XW83TehAoGBALVPGnznScUw
O50OXKI5yhxGf/XDT8g28L8Oc4bctRzI+8YfIFfLJ57uDGuojO/BpqtYmXmgORru0jYR8idEkZrx
gf62czOiJrCWTkBCEMtrNfFHQJQCQrjfbHofp7ODnEHbHFm7zdlbfNnEBBaKXxd2rVv4UTEhgftv
wsHcimbXAoGBAIViWrHWElMeQT0datqlThE/u51mcK4VlV7iRWXVa1/gAP85ZAu44VvvDlkpYVkF
zSRR+lHSOzsubDMN45OBQW6UA3RPg4TCvrTOmhQUeF5XPuSdcD0R2At6pdaLwAKnOtILg13Ha6ym
Igjv8glodvem3hWLmpHIhNBiaXtf8wqpAoGADH5a8OhvKOtd8EChGXyp9LDW+HRw9vbyN/gi9dQX
ltgyoUBb1jDllgoJSRHgRFUvyvbb/ImR5c03JwqtiQ8siWTC9G5WGeS+jcSNt9fVmG7W1L14MbrG
Jj8fFns/7xrOlasnlPdgA+5N+CONtI/sZY2D/KZr0drhPhZBcWJlFxkCgYAn+4SOPEo/6hjKNhA6
vER7fSxDEVsDg+rDh3YgAWpvUdlaqBxqOyAqi600YugQZGHK2lv7vNYOdmrunuIx7BPuDqY+bjtR
R4Mc9bVQAZbXSLXMl7j2RWwKfNhLSJbk9LX4EoVtTgLjvOUE4tAdq9fFgpqdwLwzqPTO9kECP4++
CQKBgH6tO/xcNxG/uXUideluAn3H2KeyyznZMJ7oCvzf26/XpTAMI243OoeftiKVMgxuZ7hjwqfn
/VHXABc4i5gchr9RzSb1hZ/IqFzq2YGmbppg5Ok2cgwalDoDBi21bRf8aDRweL62mO+7aPnCQZ58
j5W72PB8BAr6xg0Oro25O4os
-----END RSA PRIVATE KEY-----
Questions similaires ont été posté ici, mais ceux-ci étaient d'aucune utilité pour moi.
Presque tous d'entre eux a suggéré d'utiliser Bouncycastle fournisseur qui ne suis pas prêt à l'utiliser comme suis censé faire appel à un prestataire qui est compatible FIPS et je ne suis pas sûr si colombie-britannique fournisseur est compatible FIPS.
Une aide dans gettin me sortir de cette situation serait très apprécié...
Merci à l'avance.
- 1)Où est l'extrait de code?2)Pourquoi ne pas utiliser Château Gonflable?
- Je ne suis pas sûr si Bouncycastle est compatible fips.je le suis aussi à l'aide de IBMJCEFIPS fournisseur.
- La colombie-britannique fournisseur n'est pas compatible FIPS. Qu'est-ce que la première ligne de votre fichier PEM, la ligne qui commence "-----BEGIN"?
- La première ligne du privé.le fichier clé est -----BEGIN RSA PRIVATE KEY-----
- à craindre que la clé est juste pour le test 😀
- Voir aussi le Déchiffrement d'un OpenSSL Encodé au format PEM clé privée RSA avec Java?, Comment obtenir la java.de sécurité.PrivateKey objet de RSA Privatekey.fichier pem? et à l'Aide d'un encodé au format PEM, chiffrée de la clé privée pour signer un message en mode natif. Certains suggèrent de convertir la clé privée de PKCS #8.
Vous devez vous connecter pour publier un commentaire.
Analyse PKCS1 (seulement PKCS8 format fonctionne hors de la boîte sur Android) clé s'est avéré être une tâche fastidieuse sur Android en raison de l'absence de ASN1 suport, encore résoluble si vous incluez Spongieux château pot de lire DER Entiers.
~/.ssh/id_rsa
)Vous avez tout juste de publier cette clé privée, de sorte que maintenant le monde entier sait ce que c'est. J'espère que c'était juste pour le test.
EDIT: D'autres ont noté que la openssl texte d'en-tête de la publication de la clé, -----BEGIN RSA PRIVATE KEY-----, indique que c'est le fichier PKCS#1. Cependant, la Base64 contenu de la clé en question est PKCS#8. Évidemment, l'OP copier-collé de l'en-tête et de la remorque d'un fichier PKCS#1 clé sur le PKCS#8 clé pour une raison inconnue. L'exemple de code que j'ai fourni ci-dessous fonctionne avec PKCS#8 clés privées.
Voici un code qui permettra de créer la clé privée à partir de ces données. Vous devrez remplacer le décodage en Base64 avec votre IBM Base64 decoder.
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source) at java.security.KeyFactory.generatePrivate(Unknown Source)
-----BEGIN RSA PRIVATE KEY-----
signifie PKCS8 formaté clés. De ma compréhension, ce sont SSLeay formaté, qui est à l'origine de l'erreur pour certains utilisateurs. Voir ma réponse: stackoverflow.com/a/22218774/1554386\n
au moyen de la clé ainsi?C'est PKCS#1 format d'une clé privée. Essayez ce code. Il n'utilise pas de Château Gonflable ou d'autres tiers crypto fournisseurs. Juste java.de sécurité et de soleil.de sécurité pour DER sequece de l'analyse. Aussi, il prend en charge l'analyse d'une clé privée dans PKCS#8 (format de fichier PEM qui a un en-tête "-----COMMENCER le PRIVATE KEY-----").
DerInputStream
etDerValue
ne sont plus disponible à partir du JDK 9.Le problème est qu'il y a deux types de format PEM clés: PKCS8 et SSLeay. Cela n'aide pas que OpenSSL semble utiliser à la fois en fonction de la commande:
L'habitude
openssl genrsa
commande va générer un SSLeay format PEM. Une exportation à partir d'un fichier PKCS12 avecopenssl pkcs12 -in file.p12
permettra de créer un PKCS8 fichier.Le dernier PKCS8 format peut être ouvert en mode natif en Java à l'aide de
PKCS8EncodedKeySpec
. SSLeay formaté clés, d'autre part, ne peut pas être ouvert en mode natif.Pour ouvrir SSLeay clés privées, vous pouvez soit utiliser BouncyCastle fournisseur comme beaucoup l'ont fait avant ou Pas-Encore-Commons-SSL ont emprunté un montant minimal de code nécessaire de BouncyCastle à l'appui de l'analyse PKCS8 et SSLeay clés en PEM et DER format: http://juliusdavies.ca/commons-ssl/pkcs8.html. (Je ne suis pas sûr si Pas-Encore-Commons-SSL sera compatible FIPS)
Format De La Clé D'Identification
Par inférence à partir de la OpenSSL homme de pages, en-têtes principaux pour les deux formats sont comme suit:
PKCS8 Format
Non-crypté:
-----BEGIN PRIVATE KEY-----
Chiffré:
-----BEGIN ENCRYPTED PRIVATE KEY-----
SSLeay Format
-----BEGIN RSA PRIVATE KEY-----
(Ceux-ci semblent être en contradiction avec d'autres réponses, mais j'ai testé l'installation de OpenSSL sortie à l'aide d'
PKCS8EncodedKeySpec
. Seulement PKCS8 clés, montrant----BEGIN PRIVATE KEY-----
travailler en mode natif)Que d'autres ont répondu, la clé que vous essayez d'analyser n'a pas les bonnes PKCS#8 en-têtes d'Oracle
PKCS8EncodedKeySpec
besoins de la comprendre. Si vous ne voulez pas convertir la clé à l'aideopenssl pkcs8
ou de l'analyser à l'aide du JDK interne de l'Api, vous pouvez ajouter le fichier PKCS#8 en-tête comme ceci:Une fois que la méthode est en place, vous pouvez nourrir sortie de l'
PKCS8EncodedKeySpec
constructeur comme suit:new PKCS8EncodedKeySpec(buildPKCS8Key(privateKey));
Vous trouverez ci-dessous quelques code pour la lecture de non chiffrés clés RSA codé dans les formats suivants:
-----BEGIN RSA PRIVATE KEY-----
)-----BEGIN PRIVATE KEY-----
)Il fonctionne avec Java 7+ (et après 9) et de ne pas utiliser des bibliothèques tierces (comme BouncyCastle) ou interne de l'Api Java (comme
DerInputStream
ouDerValue
).Source: https://github.com/Mastercard/client-encryption-java/blob/master/src/main/java/com/mastercard/developer/utils/EncryptionUtils.java
Assurez-vous que votre fichier id_rsa n'ont pas d'extension comme .txt ou .rtf. Rich Text Format ajoute des caractères supplémentaires à votre fichier et ceux qui s'ajoute au tableau d'octets. Qui finalement provoque une défaillance de la clé privée d'erreur. Longue histoire courte, Copiez le fichier, pas le contenu.