Find if a certificate is self signed or CA signed

前端 未结 5 1711
情歌与酒
情歌与酒 2021-02-02 11:59

I have a web app, which allows user to upload pkcs12. I store the pkcs12 as binary in database. Is there any way for me to know if the certificate in the pkcs12 is self signed

相关标签:
5条回答
  • 2021-02-02 12:18

    Following email thread precisely tells the right way to verify if the base64 encoded certificate (i.e. PEM) is self signed or not: http://marc.info/?l=openssl-users&m=116177485311662&w=4

    Following is the code snippet:

    openssl verify -CAfile self_signed_cert.pem self_signed_cert.pem
    

    should return:

    self_signed_cert.pem: OK
    

    OR compare the issuer and subject. If they are same, it is self signed

    openssl x509 -in cert.pem -inform PEM -noout -subject -issuer
    
    0 讨论(0)
  • 2021-02-02 12:22

    The accepted answer here isn't strictly correct. Old question, but this is the first result in google for "how to tell if a certificate is self signed" so it needs to be cleared up.

    A cert is almost always self-signed if the issuer and subject match, but it's not guaranteed. A certificate can be "self-issued" where it has the same issuer/subject but is signed by a private key that isn't paired with the public key in the cert.

    The first part of the answer above from NitinB is the right way to check for a self-signed cert:

    openssl verify -CAfile self_signed_cert.pem self_signed_cert.pem

    "All self-signed certs are self-issued, but not all self-issued certs are self-signed."

    Citation: https://tools.ietf.org/html/rfc5280

    "Self-issued certificates are CA certificates in which the issuer and subject are the same entity. Self-issued certificates are generated to support changes in policy or operations. Self- signed certificates are self-issued certificates where the digital signature may be verified by the public key bound into the certificate."

    0 讨论(0)
  • 2021-02-02 12:26

    Edit: there are two better answers on this question today:

    • https://stackoverflow.com/a/57927684/377270
    • https://stackoverflow.com/a/14515875/377270

    However, I think there's something more important to address -- why would one want to know about self-signed certificates. What's the goal? What problem is being solved? Probably trying to split certificates into two piles, self-signed and not-self-signed, is the wrong approach for most situations. The better approach is almost certainly going to be verifying that any given certificate has a valid signature chain from a trusted certificate authority, and that any connections associated with a given certificate matches the certificate.

    Here's the rest of my original answer. It's probably not what you want.


    It's a bit hacky, but the openssl x509 command can report both the issuer and the subject. If the subject and issuer are the same, it is self-signed; if they are different, then it was signed by a CA. (Strictly speaking, a great many self-signed certificates are also signed by a CA -- themselves.)

    While testing this theory, I ran a handful of tests; it runs something like:

    cd /etc/ssl/certs
    for f in *.0 ; do openssl x509 -in $f -issuer | head -1 > /tmp/$f.issuer ; openssl x509 -in $f -subject | head -1 > /tmp/$f.subject ; done
     cd /tmp
     sed -i -e s/issuer=// *.issuer
     sed -i -e s/subject=// *.subject
     cd /etc/ssl/certs/
     for f in *.0 ; do diff -u /tmp/$f.issuer /tmp/$f.subject ; done
    

    Hope this helps.

    0 讨论(0)
  • 2021-02-02 12:28

    Java is unable to analyze PKCS12 so that you have to convert it to keystore using openssl.

    Here the keystore has both private key and X509 certificate(or you can choose only to store certificate). Then get the issuer from keystore using standard JAVA API and manually verify issuer.

    0 讨论(0)
  • 2021-02-02 12:32

    Have you tried the BouncyCastle lib?

    http://www.bouncycastle.org/wiki/display/JA1/Frequently+Asked+Questions

    " There are specific example programs for dealing with Attribute Certificates, PKCS12, SMIME and OpenPGP. They can be found in the packages:

    org.bouncycastle.jce.examples org.bouncycastle.mail.smime.examples org.bouncycastle.openpgp.examples Another useful source of examples is the test packages:

    org.bouncycastle.crypto.test org.bouncycastle.jce.provider.test org.bouncycastle.cms.test org.bouncycastle.mail.smime.test org.bouncycastle.openpgp.test org.bouncycastle.cert.test org.bouncycastle.pkcs.test org.bouncycastle.tsp.test "

    0 讨论(0)
提交回复
热议问题