Comment lire une clé privée pour une utilisation avec OpenSAML?
OK, c'est un autre de ces "je n'ai aucune idée par où commencer" questions, j'espère donc que la réponse est simple. Cependant, je ne sais pas vraiment quoi chercher, et mes tentatives jusqu'à présent n'ont pas beaucoup d'utilisation.
Je veux lire une clé privée à partir d'une (actuellement sur disque) fichier. En fin de compte, la clé réside dans une base de données, mais ce sera assez bon pour le moment et que la différence ne devrait pas avoir de réelles portant sur l'analyse du matériel de clé. J'ai été en mesure de créer un Credential
instance qui détient la partie publique de la clé (confirmé par le débogueur), mais je n'arrive pas à comprendre comment lire la partie privée. La paire de clés est générée comme:
openssl genrsa 512 > d:\host.key
openssl req -new -x509 -nodes -sha1 -days 365 -key d:\host.key > d:\host.cert
(Oui, je sais que 512 bits de clés RSA ont été brisées, il y a longtemps. Cependant, pour essayer d'obtenir de l'API pour le travail, je ne vois aucune raison d'échappement le système d'entropie d'approvisionnement inutilement.)
Le code jusqu'à présent est:
import org.opensaml.xml.security.credential.Credential;
import org.opensaml.xml.security.x509.BasicX509Credential;
private Credential getSigningCredential()
throws java.security.cert.CertificateException, IOException {
BasicX509Credential credential = new BasicX509Credential();
credential.setUsageType(UsageType.SIGNING);
//read public key
InputStream inStream = new FileInputStream("d:\\host.cert");
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream);
inStream.close();
credential.setEntityCertificate(cert);
//TODO: read private key
//done.
return credential;
}
Mais comment puis-je lire le fichier host.key
dans la clé privée portion de credential
, si je peux utiliser le générés Credential
instance de signer des données?
OriginalL'auteur a CVn | 2011-03-08
Vous devez vous connecter pour publier un commentaire.
BasicX509Credential
ne fait pas partie de la norme Java; je suppose que vous parlez de laorg.opensaml.xml.security.x509.BasicX509Credential
de OpenSAML.Vous voulez un
PrivateKey
qui vous permettra de définir aveccredential.setPrivateKey()
. Pour obtenir unPrivateKey
, vous devez d'abord convertir la clé privée dans un format que Java peut lire, à savoir PKCS#8:Puis, à partir de Java:
et voilà! vous avez votre
PrivateKey
.Par défaut,
openssl
écrit clés dans son propre format (pour des clés RSA, PKCS#8 se trouve être un wrapper autour de ce format), et il les encode dans le format PEM, qui Base64 avec un en-tête et un pied de page. Les deux caractéristiques sont prises en charge par la plaine de Java, d'où la conversion à PKCS#8. Le-nocrypt
option est parce que PKCS#8 prend en charge en option chiffrement par mot de passe de clé privée.Avertissement: vous vraiment vraiment souhaitez utiliser un plus de clés RSA. 512 bits sont faibles; une de 512 bits de clé RSA a été cassé en 1999, avec quelques centaines d'ordinateurs. En 2011, avec 12 ans d'avancées technologiques, on devrait considérer que l'une de 512 bits de clé RSA peut être rompu par presque tout le monde. Par conséquent, le recours RSA de 1024 bits clés au moins (de préférence, est de 2048 bits; le calcul de la surcharge lors de l'utilisation de la clé n'est pas mauvais en soit, vous serez toujours en mesure d'effectuer des centaines de signatures par seconde).
Semble fonctionner comme un charme, merci beaucoup! Bien sûr, mon code de signature semble être rompu, mais au moins, selon le débogueur, je reçois un bon
Credential
à partir de deux fichiers sur le disque. Sur le tour...Je vous remercie. J'ai eu mystérieux des problèmes avec la redirection des < et > à Windows, donc on peut les remplacer par et les interrupteurs.
OriginalL'auteur Thomas Pornin
Cette question est liée à la SAML et est également pertinent pour quelqu'un qui veut récupérer une clé privée pour signer un XMLObject. La réponse ci-dessus fonctionne très bien et il est également possible de récupérer une clé privée à partir d'un fichier de clés:
C'est que le code de la requête d'origine demandé, mais il semble qu'ils essaient d'accéder à un BasicX509Credential.
Grâce,
Yogesh
OriginalL'auteur Yogesh Chawla