Skip to content

voms-proxy-init fails to decrypt the private key of my EEC #19

@paulmillar

Description

@paulmillar

Here is voms-proxy-init not working:

paul@sprocket:~$ voms-proxy-init
Enter GRID pass phrase for this identity:
Credentials couldn't be loaded [/home/paul/.globus/userkey.pem, /home/paul/.globus/usercert.pem]: Error decrypting private key: the password is incorrect or the PEM data is corrupted.
No credentials found!
paul@sprocket:~$ 

This is actually voms-proxy-inti3:

paul@sprocket:~$ voms-proxy-init -version
voms-proxy-init v. 3.0.7 (voms-api-java/3.2.0 canl/2.4.1 bouncycastle/1.56.0 bcmail/1.56.0.0)
paul@sprocket:~$ 

Here are other tools successfully creating a proxy from the same EEC:

paul@sprocket:~$ voms-proxy-init2 
Enter GRID pass phrase:
Your identity: /C=DE/O=GermanGrid/OU=DESY/CN=Alexander Paul Millar
Creating proxy ................... Done

Your proxy is valid until Tue Jul 17 00:46:22 2018
paul@sprocket:~$ 
paul@sprocket:~$ arcproxy 
Enter pass phrase for private key:
Your identity: /C=DE/O=GermanGrid/OU=DESY/CN=Alexander Paul Millar
Proxy generation succeeded
Your proxy is valid until: 2018-07-17 00:46:44
paul@sprocket:~$ 

Here are some environment details:

paul@sprocket:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 9.5 (stretch)
Release:        9.5
Codename:       stretch
paul@sprocket:~$ 
paul@sprocket:~$ dpkg -l voms-clients-java libvoms-api-java-java libcanl-java libbcpkix-java libbcprov-java
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                        Version                    Architecture               Description
+++-===========================================-==========================-==========================-===========================================================================================
ii  libbcpkix-java                              1.56-1+deb9u2              all                        Bouncy Castle Java API for PKIX, CMS, EAC, TSP, PKCS, OCSP, CMP, and CRMF
ii  libbcprov-java                              1.56-1+deb9u2              all                        Bouncy Castle Java Cryptographic Service Provider
ii  libcanl-java                                2.4.1-1                    all                        EMI Common Authentication library - bindings for Java
ii  libvoms-api-java-java                       3.2.0-1                    all                        Virtual Organization Membership Service Java API
ii  voms-clients-java                           3.0.7-1                    all                        Virtual Organization Membership Service Java clients
paul@sprocket:~$ 

Since the error message doesn't really say what went wrong (perhaps another bug, there), I took the current versions of libraries (available through Debian stretch) and added some simple debugging:

paul@sprocket:~/git/voms-clients$ git diff
diff --git a/src/main/java/org/italiangrid/voms/clients/impl/ProxyInitListenerHelper.java b/src/main/java/org/italiangrid/voms/clients/impl/ProxyInitListenerHelper.java
index bd2bc65..331e27b 100644
--- a/src/main/java/org/italiangrid/voms/clients/impl/ProxyInitListenerHelper.java
+++ b/src/main/java/org/italiangrid/voms/clients/impl/ProxyInitListenerHelper.java
@@ -200,6 +200,7 @@ public class ProxyInitListenerHelper implements InitListenerAdapter {
 
     logger.formatMessage(level, "Credentials couldn't be loaded %s: %s\n",
       Arrays.toString(locations), error.getMessage());
+    error.printStackTrace();
 
   }
 
paul@sprocket:~/git/voms-clients$ 
paul@sprocket:~/git/canl-java$ git diff
diff --git a/src/main/java/eu/emi/security/authn/x509/impl/CertificateUtils.java b/src/main/java/eu/emi/security/authn/x509/impl/CertificateUtils.java
index d309b1c..8098a12 100644
--- a/src/main/java/eu/emi/security/authn/x509/impl/CertificateUtils.java
+++ b/src/main/java/eu/emi/security/authn/x509/impl/CertificateUtils.java
@@ -293,6 +293,7 @@ public class CertificateUtils
        private static PrivateKeyInfo resolvePK(String type, Object src, PasswordFinder pf) throws 
                IOException, OperatorCreationException, PKCSException
        {
+                System.err.println("resolvePK: type=" + type + ", src=" + src.getClass());
                if (src instanceof PrivateKeyInfo)
                        return (PrivateKeyInfo) src;
                
paul@sprocket:~/git/canl-java$ 

Here is the output of voms-proxy-init when run with these patched libraries:

resolvePK: type=PEM, src=class org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo
Enter GRID pass phrase for this identity:
Credentials couldn't be loaded [/home/paul/.globus/userkey.pem, /home/paul/.globus/usercert.pem]: Error decrypting private key: the password is incorrect or the PEM data is corrupted.
java.io.IOException: Error decrypting private key: the password is incorrect or the PEM data is corrupted.
        at eu.emi.security.authn.x509.impl.CertificateUtils.convertToPrivateKey(CertificateUtils.java:286)
        at eu.emi.security.authn.x509.impl.CertificateUtils.internalLoadPK(CertificateUtils.java:271)
        at eu.emi.security.authn.x509.impl.CertificateUtils.loadPEMPrivateKey(CertificateUtils.java:242)
        at eu.emi.security.authn.x509.impl.PEMCredential.init(PEMCredential.java:230)
        at eu.emi.security.authn.x509.impl.PEMCredential.<init>(PEMCredential.java:161)
        at org.italiangrid.voms.credential.impl.AbstractLoadCredentialsStrategy.loadPEMCredential(AbstractLoadCredentialsStrategy.java:102)
        at org.italiangrid.voms.credential.impl.DefaultLoadCredentialsStrategy.loadPEMCredentialsFromGlobusDir(DefaultLoadCredentialsStrategy.java:201)
        at org.italiangrid.voms.credential.impl.DefaultLoadCredentialsStrategy.loadCredentials(DefaultLoadCredentialsStrategy.java:132)
        at org.italiangrid.voms.clients.impl.DefaultVOMSProxyInitBehaviour.lookupCredential(DefaultVOMSProxyInitBehaviour.java:603)
        at org.italiangrid.voms.clients.impl.DefaultVOMSProxyInitBehaviour.initProxy(DefaultVOMSProxyInitBehaviour.java:187)
        at org.italiangrid.voms.clients.VomsProxyInit.execute(VomsProxyInit.java:307)
        at org.italiangrid.voms.clients.VomsProxyInit.<init>(VomsProxyInit.java:71)
        at org.italiangrid.voms.clients.VomsProxyInit.main(VomsProxyInit.java:55)
Caused by: org.bouncycastle.pkcs.PKCSException: unable to read encrypted data: javax.crypto.BadPaddingException: pad block corrupted
        at org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo.decryptPrivateKeyInfo(PKCS8EncryptedPrivateKeyInfo.java:72)
        at eu.emi.security.authn.x509.impl.CertificateUtils.resolvePK(CertificateUtils.java:307)
        at eu.emi.security.authn.x509.impl.CertificateUtils.convertToPrivateKey(CertificateUtils.java:280)
        ... 12 more
Caused by: java.io.IOException: javax.crypto.BadPaddingException: pad block corrupted
        at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:121)
        at javax.crypto.CipherInputStream.read(CipherInputStream.java:239)
        at org.bouncycastle.util.io.Streams.pipeAll(Streams.java:114)
        at org.bouncycastle.util.io.Streams.readAll(Streams.java:41)
        at org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo.decryptPrivateKeyInfo(PKCS8EncryptedPrivateKeyInfo.java:68)
        ... 14 more
Caused by: javax.crypto.BadPaddingException: pad block corrupted
        at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher.doFinal(BaseBlockCipher.java:1215)
        at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(BaseBlockCipher.java:1050)
        at javax.crypto.Cipher.doFinal(Cipher.java:2047)
        at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:118)
        ... 18 more
java.io.FileNotFoundException: /home/paul/.globus/usercred.p12 (cannot read file)
        at org.italiangrid.voms.credential.impl.AbstractLoadCredentialsStrategy.loadPKCS12Credential(AbstractLoadCredentialsStrategy.java:151)
        at org.italiangrid.voms.credential.impl.DefaultLoadCredentialsStrategy.loadPKCS12CredentialsFromGlobusDir(DefaultLoadCredentialsStrategy.java:192)
        at org.italiangrid.voms.credential.impl.DefaultLoadCredentialsStrategy.loadCredentials(DefaultLoadCredentialsStrategy.java:135)
        at org.italiangrid.voms.clients.impl.DefaultVOMSProxyInitBehaviour.lookupCredential(DefaultVOMSProxyInitBehaviour.java:603)
        at org.italiangrid.voms.clients.impl.DefaultVOMSProxyInitBehaviour.initProxy(DefaultVOMSProxyInitBehaviour.java:187)
        at org.italiangrid.voms.clients.VomsProxyInit.execute(VomsProxyInit.java:307)
        at org.italiangrid.voms.clients.VomsProxyInit.<init>(VomsProxyInit.java:71)
        at org.italiangrid.voms.clients.VomsProxyInit.main(VomsProxyInit.java:55)
No credentials found!

Here's a rough summary of the credentials:

paul@sprocket:~$ cat ~/.globus/userkey.pem
Bag Attributes
    friendlyName: Alexander Paul Millar^Ys GermanGrid ID
    localKeyID: 96 1A 91 EA 36 22 DD 26 BB F2 DF 2B 2A D3 04 21 AF 06 36 5B
Key Attributes: <No Attributes>
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQInzxyNT6UxBMCAggA
[...]
GRLQOWr+BHG2Q0sugNnQeA==
-----END ENCRYPTED PRIVATE KEY-----
paul@sprocket:~$ 
paul@sprocket:~$ cat ~/.globus/usercert.pem
Bag Attributes
    friendlyName: Alexander Paul Millars GermanGrid ID
    localKeyID: 96 1A 91 EA 36 22 DD 26 BB F2 DF 2B 2A D3 04 21 AF 06 36 5B
subject=/C=DE/O=GermanGrid/OU=DESY/CN=Alexander Paul Millar
issuer=/C=DE/O=GermanGrid/CN=GridKa-CA
-----BEGIN CERTIFICATE-----
MIIELTCCAxWgAwIBAgIDAIF1MA0GCSqGSIb3DQEBDQUAMDYxCzAJBgNVBAYTAkRF
[...]
HqQXxWaEGo26n8s+XDGCEQ4=
-----END CERTIFICATE-----
paul@sprocket:~$

I've configured my laptop to use voms-proxy-init2 as a work-around, so this isn't urgent

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions