Take a look at: http://www.metacentrum.cz/en/about/devel/pkcs11.html and https://lists.strongswan.org/pipermail/users/2007-July/001900.html
the basic idea is that you don't extract a private key, but you ask the nss softtoken to sign a request for you. HTH, JJK weizhong qiang wrote: > hi Alon, > > > On Nov 10, 2011, at 8:24 AM, Alon Bar-Lev wrote: > >> Hello, >> >> You can't. >> pkcs11-helper targets developers who want to use smartcards without >> overhead of the actual card management. >> Well behaved smartcards should not allow export of private key. > > But it seems the pk12util can accomplish this task. > https://developer.mozilla.org/en/NSS_reference/NSS_tools_:_pk12util > >> >> Why do you need the private key anyway? > > My current code (based on openssl) is for grid computing usage. We use > file-based EEC credential (cert.pem, key.pem) to generate a proxy > certificate, and then use the proxy certificate to communicate with > peer ends. > Now we need to switch to pkcs11 to utilize pkcs11 for the storage of > EEC credential, instead of the file-based storage, because pkcs11 > provides more level of security. > > Why I need to retrieve private key is I need the X509 and private key > for generating the proxy certificate. > > I see some piece of code here: > http://codesearch.google.com/#RnTPnPMDu28/staticopenvpn/openvpn/pkcs11.c&ct=rc&cd=1&q=SSL_CTX_use_pkcs11&exact_package=git://github.com/spokn/lib.git&l=606 > > <http://codesearch.google.com/#RnTPnPMDu28/staticopenvpn/openvpn/pkcs11.c&ct=rc&cd=1&q=SSL_CTX_use_pkcs11&exact_package=git://github.com/spokn/lib.git&l=606> > > /**********/ > if ((rsa = pkcs11h_openssl_session_getRSA (openssl_session)) == NULL) { > msg (M_WARN, "PKCS#11: Unable get rsa object"); > goto cleanup; > } > > if ((x509 = pkcs11h_openssl_session_getX509 (openssl_session)) == > NULL) { > msg (M_WARN, "PKCS#11: Unable get certificate object"); > goto cleanup; > } > > if (!SSL_CTX_use_RSAPrivateKey (ssl_ctx, rsa)) { > msg (M_WARN, "PKCS#11: Cannot set private key for openssl"); > goto cleanup; > } > > if (!SSL_CTX_use_certificate (ssl_ctx, x509)) { > msg (M_WARN, "PKCS#11: Cannot set certificate for openssl"); > goto cleanup; > } > ******/ > From the above code, I concluded that it is possible to retrieve the > private key. Maybe this piece of code will not work. > Thanks for your kind help. > Best Regards, > Weizhong Qiang > > >> >> Alon. >> >> On Thu, Nov 10, 2011 at 3:27 AM, weizhong qiang >> <weizhongqi...@gmail.com <mailto:weizhongqi...@gmail.com>> wrote: >>> hi all, >>> I tried to use pkcs11-helper api to retrieve X509 and private key >>> from nss softtoken, wit the 1.09 version of pkcs11-helper. >>> I can get X509 object, but the returned RSA object only includes >>> public key, rather than private key. >>> I paste the code as the following. >>> Could anyone give me some hint about how to get private key? >>> >>> Thanks a lot, >>> Weizhong Qiang >>> >>> >>> >>> pkcs11h_certificate_id_list_t issuers; >>> pkcs11h_certificate_id_list_t certs; >>> pkcs11h_certificate_id_t find = NULL; >>> CK_RV rv = >>> pkcs11h_certificate_enumCertificateIds(PKCS11H_ENUM_METHOD_CACHE, NULL, >>> PKCS11H_PROMPT_MASK_ALLOW_ALL, &issuers, &certs); >>> if(rv != CKR_OK || certs == NULL) { >>> PKCS11UtilLogger.msg(ERROR, "Cannot enumerate certificates: >>> %s", pkcs11h_getMessage(rv)); >>> return false; >>> } >>> PKCS11UtilLogger.msg(INFO, "Succeed to enumerate certificate"); >>> >>> int i = 0; >>> for(pkcs11h_certificate_id_list_t cert = certs; cert != NULL; >>> cert = cert->next) { >>> std::string label=cert->certificate_id->displayName; >>> i++; >>> PKCS11UtilLogger.msg(INFO, "The name of the %d certficate is %s >>> \n", i, label.c_str()); >>> if(certname == label) { >>> pkcs11h_certificate_duplicateCertificateId(&find, >>> cert->certificate_id); >>> //TODO: probably it is need to deal with the case that >>> multiple certificate with the same name exists. >>> break; >>> } >>> } >>> >>> pkcs11h_certificate_freeCertificateIdList(issuers); >>> pkcs11h_certificate_freeCertificateIdList(certs); >>> >>> if(find == NULL) { >>> PKCS11UtilLogger.msg(ERROR, "Could not find certificate with >>> the name %s", certname.c_str()); >>> return false; >>> } >>> >>> pkcs11h_certificate_t certificate; >>> rv = pkcs11h_certificate_create(find, NULL, >>> PKCS11H_PROMPT_MASK_ALLOW_ALL, PKCS11H_PIN_CACHE_INFINITE, >>> &certificate); >>> if(rv != CKR_OK) { >>> PKCS11UtilLogger.msg(ERROR, "Can not read certificate: %s", >>> pkcs11h_getMessage(rv)); >>> pkcs11h_certificate_freeCertificateId(find); >>> return false; >>> } >>> pkcs11h_certificate_freeCertificateId(find); >>> >>> pkcs11h_openssl_session_t openssl_session = NULL; >>> if((openssl_session = pkcs11h_openssl_createSession(certificate)) >>> == NULL) { >>> PKCS11UtilLogger.msg(ERROR, "Cannot initialize openssl session >>> to retrieve X509 and RSA"); >>> pkcs11h_certificate_freeCertificate(certificate); >>> } >>> certificate = NULL; // the certificate object will be released by >>> openssl_session >>> >>> bool ret; >>> X509* x509_local; >>> RSA* rsa_local; >>> x509_local = pkcs11h_openssl_session_getX509(openssl_session); >>> if(!x509_local) { PKCS11UtilLogger.msg(ERROR, "Cannot get X509 >>> object"); ret = false; } >>> rsa_local = pkcs11h_openssl_session_getRSA (openssl_session); >>> if(!rsa_local) { PKCS11UtilLogger.msg(ERROR, "Cannot get RSA >>> object"); ret = false; } >>> ret = true; >>> >>> PKCS11UtilLogger.msg(INFO, "Succeed to get X509 and RSA"); >>> *x509 = x509_local; >>> *rsa = rsa_local; >>> pkcs11h_openssl_freeSession (openssl_session); >>> return ret; >>> >>> >>> _______________________________________________ >>> opensc-devel mailing list >>> opensc-devel@lists.opensc-project.org >>> <mailto:opensc-devel@lists.opensc-project.org> >>> http://www.opensc-project.org/mailman/listinfo/opensc-devel >>> > > ------------------------------------------------------------------------ > > _______________________________________________ > opensc-devel mailing list > opensc-devel@lists.opensc-project.org > http://www.opensc-project.org/mailman/listinfo/opensc-devel _______________________________________________ opensc-devel mailing list opensc-devel@lists.opensc-project.org http://www.opensc-project.org/mailman/listinfo/opensc-devel