Je suis assez nouveau HTTPS/SSL/TLS
et je suis un peu confus sur ce que les clients sont censés présenter exactement lors de l'authentification avec des certificats.
J'écris un client Java qui doit faire un simple POST
de données à un particulier URL
. Cette partie fonctionne bien, le seul problème est qu'elle est censée être terminée HTTPS
. La HTTPS
partie est assez facile à manipuler (avec HTTPclient
ou en utilisant le HTTPS
support intégré de Java ), mais je suis bloqué sur l'authentification avec les certificats clients. J'ai remarqué qu'il y a déjà une question très similaire ici, que je n'ai pas encore essayée avec mon code (le fera assez tôt). Mon problème actuel est que - quoi que je fasse - le client Java n'envoie jamais le certificat (je peux le vérifier avec des PCAP
vidages).
Je voudrais savoir exactement ce que le client est censé présenter au serveur lors de l'authentification avec des certificats (spécifiquement pour Java - si cela est important)? Est-ce un JKS
fichier, ou PKCS#12
? Ce qui est censé être en eux; juste le certificat client ou une clé? Si oui, quelle clé? Il y a pas mal de confusion sur tous les différents types de fichiers, les types de certificats et autres.
Comme je l'ai déjà dit, je suis novice, HTTPS/SSL/TLS
donc j'apprécierais également quelques informations de base (ne doit pas être un essai; je me contenterai de liens vers de bons articles).
la source
Réponses:
Enfin réussi à résoudre tous les problèmes, je vais donc répondre à ma propre question. Ce sont les paramètres / fichiers que j'ai utilisés pour gérer la résolution de mes problèmes particuliers;
Le fichier de clés du client est un fichier au format PKCS # 12 contenant
Pour le générer, j'ai utilisé la
pkcs12
commande d'OpenSSL , par exemple;Astuce: assurez-vous d'obtenir la dernière version d' OpenSSL, pas la version 0.9.8h car cela semble souffrir d'un bogue qui ne vous permet pas de générer correctement les fichiers PKCS # 12.
Ce fichier PKCS # 12 sera utilisé par le client Java pour présenter le certificat client au serveur lorsque le serveur a explicitement demandé au client de s'authentifier. Voir l'article Wikipedia sur TLS pour un aperçu du fonctionnement du protocole d'authentification par certificat client (explique également pourquoi nous avons besoin de la clé privée du client ici).
Le fichier de clés certifiées du client est un fichier au format JKS simple contenant les certificats d'autorité de certification racine ou intermédiaire . Ces certificats d'autorité de certification détermineront les points de terminaison avec lesquels vous serez autorisé à communiquer, dans ce cas, ils permettront à votre client de se connecter au serveur qui présente un certificat signé par l'une des autorités de certification du magasin de clés de confiance.
Pour le générer, vous pouvez utiliser le keytool Java standard, par exemple;
À l'aide de ce magasin de clés de confiance, votre client essaiera d'effectuer une négociation SSL complète avec tous les serveurs qui présentent un certificat signé par l'autorité de certification identifiée par
myca.crt
.Les fichiers ci-dessus sont strictement réservés au client. Lorsque vous souhaitez également configurer un serveur, le serveur a besoin de ses propres fichiers de clés et de fichiers de clés certifiées. Une grande procédure pas à pas pour configurer un exemple pleinement fonctionnel pour un client et un serveur Java (à l'aide de Tomcat) peut être trouvée sur ce site Web .
Problèmes / remarques / conseils
-Djavax.net.debug=ssl
mais plus structuré et (sans doute) plus facile à interpréter si vous n'êtes pas à l'aise avec la sortie de débogage SSL SSL.Il est parfaitement possible d'utiliser la bibliothèque Apache httpclient. Si vous souhaitez utiliser httpclient, remplacez simplement l'URL de destination par l'équivalent HTTPS et ajoutez les arguments JVM suivants (qui sont les mêmes pour tout autre client, quelle que soit la bibliothèque que vous souhaitez utiliser pour envoyer / recevoir des données via HTTP / HTTPS) :
la source
SSLContext
comme dans la réponse de @ Magnus.D'autres réponses montrent comment configurer globalement les certificats clients. Cependant, si vous souhaitez définir par programme la clé client pour une connexion particulière, plutôt que de la définir globalement dans chaque application exécutée sur votre machine virtuelle Java, vous pouvez configurer votre propre SSLContext comme suit:
la source
sslContext = SSLContexts.custom().loadTrustMaterial(keyFile, PASSWORD).build();
. Je ne pouvais pas le faire fonctionnerloadKeyMaterial(...)
.loadKeyMaterial(keystore, keyPassphrase.toCharArray())
code!SSLContext
.Le fichier JKS n'est qu'un conteneur de certificats et de paires de clés. Dans un scénario d'authentification côté client, les différentes parties des clés seront situées ici:
La séparation de truststore et keystore n'est pas obligatoire mais recommandée. Il peut s'agir du même fichier physique.
Pour définir les emplacements du système de fichiers des deux magasins, utilisez les propriétés système suivantes:
et sur le serveur:
Pour exporter le certificat du client (clé publique) dans un fichier, afin de pouvoir le copier sur le serveur, utilisez
Pour importer la clé publique du client dans le magasin de clés du serveur, utilisez (comme l'affiche l'a mentionné, cela a déjà été fait par les administrateurs du serveur)
la source
Maven pom.xml:
Code Java:
la source
configureRequest()
pour définir le proxy du projet client est-elle correcte?Pour ceux d'entre vous qui souhaitent simplement configurer une authentification bidirectionnelle (certificats serveur et client), une combinaison de ces deux liens vous y mènera:
Configuration d'authentification bidirectionnelle:
https://linuxconfig.org/apache-web-server-ssl-authentication
Vous n'avez pas besoin d'utiliser le fichier de configuration openssl qu'ils mentionnent; il suffit d'utiliser
$ openssl genrsa -des3 -out ca.key 4096
$ openssl req -new -x509 -days 365 -key ca.key -out ca.crt
pour générer votre propre certificat CA, puis générer et signer les clés de serveur et de client via:
$ openssl genrsa -des3 -out server.key 4096
$ openssl req -new -key server.key -out server.csr
$ openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 100 -out server.crt
et
$ openssl genrsa -des3 -out client.key 4096
$ openssl req -new -key client.key -out client.csr
$ openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 101 -out client.crt
Pour le reste, suivez les étapes du lien. La gestion des certificats pour Chrome fonctionne de la même manière que dans l'exemple de Firefox qui est mentionné.
Ensuite, configurez le serveur via:
https://www.digitalocean.com/community/tutorials/how-to-create-a-ssl-certificate-on-apache-for-ubuntu-14-04
Notez que vous avez déjà créé le serveur .crt et .key afin que vous n'ayez plus à faire cette étape.
la source
server.key
pas utiliserclient.key
Je me suis connecté à une banque avec SSL bidirectionnel (certificat client et serveur) avec Spring Boot. Décrivez donc ici toutes mes étapes, j'espère que cela aide quelqu'un (solution de travail la plus simple, j'ai trouvé):
Générer une requête sertificate:
Générer une clé privée:
Générer une demande de certificat:
Conserver
user.key
(et mot de passe) et envoyer la demande de certificatuser.csr
à la banque pour mon sertificateRecevez 2 certificats: mon certificat racine client et mon certificat
clientId.crt
racine banque:bank.crt
Créer un magasin de clés Java (entrez le mot de passe de la clé et définissez le mot de passe du magasin de clés):
Ne prêtez pas attention à la sortie:
unable to write 'random state'
. Java PKCS12keystore.p12
créé.Ajouter dans le magasin de clés
bank.crt
(pour plus de simplicité, j'ai utilisé un magasin de clés):Vérifiez les certificats de magasin de clés en:
Prêt pour le code Java :) J'ai utilisé Spring Boot
RestTemplate
avec uneorg.apache.httpcomponents.httpcore
dépendance supplémentaire :la source
Étant donné un fichier p12 avec à la fois le certificat et la clé privée (généré par openssl, par exemple), le code suivant l'utilisera pour une HttpsURLConnection spécifique:
L'
SSLContext
initialisation prend un certain temps, vous pouvez donc le mettre en cache.la source
Je pense que le correctif était le type de magasin de clés, pkcs12 (pfx) a toujours une clé privée et le type JKS peut exister sans clé privée. Sauf si vous spécifiez dans votre code ou sélectionnez un certificat via un navigateur, le serveur n'a aucun moyen de savoir qu'il représente un client à l'autre bout.
la source