6
votes

Accéder à la boutique de certificats de la machine locale à Java?

est-il possible d'accéder aux certificats stockés dans le magasin de la machine locale (plutôt que l'utilisateur actuel) d'un servlet Java? J'ai essayé d'utiliser le fournisseur MSCAPI en ouvrant les magasins "Windows-My" et "Windows-Root", mais ne contient pas de certificats à partir du magasin de machines locales.


3 commentaires

Avez-vous atteint ce que vous vouliez ici? J'ai le même problème, sans chance du tout.


@skw Non, je n'ai jamais été capable de récupérer des certs de la machine locale de Pure Java, j'ai fini par utiliser Entrust's Fournisseur (qui fait un appel JNI) pour récupérer les certs dont j'avais besoin.


Merci pour votre réponse. Dommage que ce ne soit pas Java natif. Je pense que cela pourrait être un problème de sécurité.


4 Réponses :


-1
votes

Les certificats que vous recherchez sont dans le fichier KeyStore Java ou sont passés à Tomcat lors du démarrage du serveur

http://tomcat.apache.org/tomcat-4.0-doc/ssl-howto.html

Si vous essayez de les charger Dans votre application, examinez ici pour effectuer des demandes HTTPS, la documentation httpClient vous aidera à démarrer

http://www.jdocs.com/httpClient/3.0.1/aplient- index.html? m = classe & p = org.apache.commons.httpclient.contrib.ssl & c = authsslprotocolsocketfactory & rendu = classique

Je ne sais pas si cela vous aide, mais si vous pouvez fournir plus de détails, mais si vous pouvez fournir plus de détails, mais si vous pouvez fournir plus de détails, mais si vous pouvez fournir plus de détails, mais si vous pouvez fournir plus de détails Ensuite, vous pourrez peut-être obtenir une réponse plus spécifique xxx


1 commentaires

Je ne cherche pas à faire SSL. Je souhaite accéder aux certificats de la machine et retirer leur paire de clé pour chiffrer / déchiffrer certains paramètres dans les fichiers de configuration. Je l'ai fait avec des certificats dans le magasin de certificats personnels actuels de l'utilisateur, mais j'aimerais tirer (SSL) des certificats hors de la machine-machine locale pour la crypto à la place.



3
votes

La mise en œuvre par défaut JDK est assez limitée. Afaik, il ne fera que ramener des clés et des certificats RSA. Ce n'est pas un adaptateur général à MSCAPI. J'ai pu récupérer des certs en utilisant le mécanisme que vous décrivez.


5 commentaires

Tout ce que je veux, c'est la paire de clés RSA. Vous avez raison, je peux obtenir la paire de clés de la boutique personnelle de l'utilisateur actuel (Windows-My) de l'utilisateur, mais j'aimerais que je souhaite les obtenir à partir du magasin de certificats personnels de la machine locale. Je n'ai pas trouvé de moyen de spécifier quel magasin de certificats (utilisateur actuel / machine locale) à lire. Il semble que je veux seulement lire de l'utilisateur actuel.


Je vois ce que vous voulez faire, mais pourquoi devriez-vous vous laisser lire dans les magasins d'autres utilisateurs? La machine locale a-t-elle des paires de clés dans son magasin? - Si oui, votre processus Java aurait besoin de la permission d'agir dans le cadre du système d'exploitation.


Oui, la machine locale a une paire de clés dans son magasin; Avez-vous une idée de la manière dont je pouvais donner à ma permission de processus Java d'agir dans le cadre du système d'exploitation?


C'est l'une des choses difficiles à propos de Java, car Java.exe est le binaire, vous devez lui donner la permission (pas le fichier de classe) Si je me souviens bien, votre processus doit revendiquer activement l'autorisation du code natif. Je devrais également mentionner que je devine sur la permission du système d'exploitation dont vous aurez besoin. Pouvez-vous d'abord mettre un certificat de confiance (pas une paire de clés) dans la racine Windows et la récupérer?


Oui, je peux récupérer des certificats de la machine-racine de la machine locale Fine, la machine locale Windows-My Store apparaît cependant vide vers Java.



3
votes

J'ai utilisé la JNA usagée pour accéder aux certificats à l'aide de la même boîte de dialogue Windows qui apparaît si vous souhaitez utiliser n'importe quel programme spécifique Windows - cela peut ne pas répondre à votre question, mais vous permet de fournir une option pour accéder à quoi que ce soit de «Windows Way». ':

    NativeLibrary cryptUI = NativeLibrary.getInstance("Cryptui");
    NativeLibrary crypt32 = NativeLibrary.getInstance("Crypt32");

    Function functionCertOpenSystemStore = crypt32.getFunction("CertOpenSystemStoreA");
    Object[] argsCertOpenSystemStore = new Object[] { 0, "CA"};
    HANDLE h = (HANDLE) functionCertOpenSystemStore.invoke(HANDLE.class, argsCertOpenSystemStore);

    Function functionCryptUIDlgSelectCertificateFromStore = cryptUI.getFunction("CryptUIDlgSelectCertificateFromStore");
    System.out.println(functionCryptUIDlgSelectCertificateFromStore.getName());
    Object[] argsCryptUIDlgSelectCertificateFromStore = new Object[] { h, 0, 0, 0, 16, 0, 0};
    Pointer ptrCertContext = (Pointer) functionCryptUIDlgSelectCertificateFromStore.invoke(Pointer.class, argsCryptUIDlgSelectCertificateFromStore);

    Function functionCertGetNameString = crypt32.getFunction("CertGetNameStringW");
    char[] ptrName = new char[128];
    Object[] argsCertGetNameString = new Object[] { ptrCertContext, 5, 0, 0, ptrName, 128};
    functionCertGetNameString.invoke(argsCertGetNameString);
    System.out.println("Selected certificate is " + new String(ptrName));

    Function functionCertFreeCertificateContext = crypt32.getFunction("CertFreeCertificateContext");
    Object[] argsCertFreeCertificateContext = new Object[] { ptrCertContext};
    functionCertFreeCertificateContext.invoke(argsCertFreeCertificateContext);

    Function functionCertCloseStore = crypt32.getFunction("CertCloseStore");
    Object[] argsCertCloseStore = new Object[] { h, 0};
    functionCertCloseStore.invoke(argsCertCloseStore);


1 commentaires

Comment puis-je obtenir le fournisseur de PrivateKey en utilisant de cette façon?



2
votes

Comme d'autres personnes ont mentionné, le fournisseur MSCAPI ne donne pas accès aux certificats et aux clés stockées dans le magasin de certificats "ordinateur local". La raison en est que MSCAPI utilise la fonction Microsoft Cryptoapi CertopensystemStore pour accéder aux certificats et aux clés. Le La documentation de cette fonction stipule explicitement que "seuls les certificats d'utilisateur actuels sont accessibles à l'aide de cette méthode, pas du magasin de machines locales". Vous pouvez suivre Ce bogue OpenJDK si vous voulez suivre les progrès sur cette question.

Si vous souhaitez une solution appropriée au problème, vous pouvez acheter le commerce pheox JCAPI bibliothèque.

Si vous pouvez vivre avec un hack, j'ai créé un utilitaire simple Cela intercepte l'appel JDKS à CeropensystemStore et renvoie une poignée à un magasin de certificats virtuels permettant d'accéder en lecture seule aux certificats et aux clés de la "machine actuelle" et "machine locale". Cela a résolu mon problème, mais soyez conscient des limitations de cet utilitaire.


0 commentaires