zoukankan      html  css  js  c++  java
  • Certificate Formats X.509, DER and PEM

    Certificate Formats - X.509, DER and PEM

    Part:   1  2  3 

    Certificate standard and file encodings seem to be confusing. I wrote down some notes about:

    • What is X.509 Certificate Standard?
    • PEM (Privacy Enhanced Mail) Encoding
    • DER (Distinguished Encoding Rules) Encoding
    • "keytool" Exporting Certificates in DER and PEM
    • "OpenSSL" Verifying "keytool" Certificates
    • "OpenSSL" Generating Certificates in DER and PEM
    • "keytool" Viewing "OpenSSL" Certificates
    • "keytool" Importing "OpenSSL" Certificates

    X.509 Certificate Standard

    X.509 is an international standard for what should be included in a digital certificate. Here is the definition from webpedia.com:

    A widely used standard for defining digital certificates. X.509 (Version 1) was first issued in 1988 as a part of the ITU X.500 Directory Services standard. When X.509 was revised in 1993, two more fields were added resulting in the Version 2 format. These two additional fields support directory access control. X.509 Version 3 defines the format for certificate extensions used to store additional information regarding the certificate holder and to define certificate usage. Collectively, the term X.509 refers to the latest published version, unless the version number is stated.

    X.509 is published as ITU recommendation ITU-T X.509 (formerly CCITT X.509) and ISO/IEC/ITU 9594-8 which defines a standard certificate format for public key certificates and certification validation. With minor differences in dates and titles, these publications provide identical text in the defining of public-key and attribute certificates.

    My understanding of X.509 is that a certificate is required to have the following information:

    • Version - X.509 standard version number.
    • Serial Number - A sequence number given to each certificate.
    • Signature Algorithm Identifier - Name of the algorithm used to sign this certificate by the issuer
    • Issuer Name - Name of the issuer.
    • Validity Period - Period during which this certificate is valid.
    • Subject Name - Name of the owner of the public key.
    • Subject Public Key Information - The public key and its related information.

    The content structure of a Version 3 X.509 certificate should look like this:

    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number: 1185572113 (0x46aa6511)
            Signature Algorithm: dsaWithSHA1
            Issuer: C=CA, ST=Herong State, L=Herong City, ... 
            Validity
                Not Before: Apr 1 21:35:13 2007 GMT
                Not After : Jun 30 21:35:13 2007 GMT
            Subject: C=CA, ST=Herong State, L=Herong City, ... 
            Subject Public Key Info:
                Public Key Algorithm: dsaEncryption
                DSA Public Key:
                    pub:
                        00:b0:61:2b:c1:88:0e:19:66:58:37:b5:...
                        ...
                    P:
                        00:fd:7f:53:81:1d:75:12:29:52:df:4a:...
                        ...
                    Q:
                        00:97:60:50:8f:15:23:0b:cc:b2:92:b9:...
                        ...
                    G:
                        00:f7:e1:a0:85:d6:9b:3d:de:cb:bc:ab:...
                        ...
       Signature Algorithm: dsaWithSHA1
           30:2c:02:14:6c:21:f3:43:b5:4f:d5:3d:2e:23:89:45:0...
           ...
    

    X.509 define how a certificate contents should be written. It does define how certificate contents should be encoded to store in files.

    Two commonly used encoding schemas are used to store X.509 certificates in files, DER and PEM, as described in next sections.

    PEM (Privacy Enhanced Mail) Encoding

    The most commonly used encoding schema for X.509 certificate files is the PEM (Privacy Enhanced Mail) encoding.

    Here is the definition of PEM on wikipedia.com: "Privacy Enhanced Mail (PEM), is an early IETF proposal for securing email using public key cryptography. Although PEM became an IETF proposed standard it was never widely deployed or used.

    The full specification of PEM is in RFC 1421. But the idea of PEM encoding on X.509 certificates is very simple:

    • Encode the content with Base64 encoding.
    • Enclose the Base64 encoding output between two lines: "-----BEGIN CERTIFICATE-----" and "-----END CERTIFICATE-----"

    Here is a structural sample of a PEM encoded X.509 certificate:

    -----BEGIN CERTIFICATE-----
    MIIDODCCAvagAwIBAgIERqplETALBgcqhkjOOAQDBQAwfzELMAkGA1UE...
    ...
    Cgfs2kXj/IQCFDC5GT5IrLTIFxAyPUo1tJo2DPkK
    -----END CERTIFICATE-----
    

    PEM encoded certificate files are supported by almost all applications. "OpenSSL" and "keytool" support PEM encoded certificate files with no problem. See other sections below for test notes.

    (Continued on next part...)

    Certificate Formats - X.509, DER and PEM

    Part:   1  2  3 

    (Continued from previous part...)

    DER (Distinguished Encoding Rules) Encoding

    DER (Distinguished Encoding Rules) is another popular encoding used to store X.509 certificate files. Here is how wikipedia.com describes PEM:

    DER or Distinguished Encoding Rules is a method for encoding a data object, such as an X.509 certificate, to be digitally signed or to have its signature verified.

    The Distinguished Encoding Rules of ASN.1 is an International Standard drawn from the constraints placed on BER encodings by X.509. DER encodings are valid BER encodings. DER is the same thing as BER with all but one sender's options removed. For example, in BER a boolean value of true can be encoded in 255 ways, while in DER there is only one way to encode a boolean value of true.

    The full specification of DER is in RFC 1421.

    X.509 certificate files encode in DER are binary files, which can not be view with text editors.

    DER encoded certificate files are supported by almost all applications. "OpenSSL" and "keytool" support DER encoded certificate files with no problem. See other sections below for test notes.

    "keytool" Exporting Certificates in DER and PEM

    My first test was about "keytool" exporting certificates in DER and PEM encodings. This was done as:

    • Using "keytool -genkeypair" to generated a key pair and a self-sign certificate in a keystore file.
    • Using "keytool -exportcert" to export the certificate in DER encoding.
    • Using "keytool -exportcert -rfc" to export the certificate in PEM encoding.

    The test session was recorded below:

    >keytool -genkeypair -keysize 1024 -alias herong_key 
    -keypass keypass -keystore herong.jks -storepass jkspass
    
    What is your first and last name?
      [Unknown]:  Herong Yang
    What is the name of your organizational unit?
      [Unknown]:  Herong Unit
    What is the name of your organization?
      [Unknown]:  Herong Company
    What is the name of your City or Locality?
      [Unknown]:  Herong City
    What is the name of your State or Province?
      [Unknown]:  Herong State
    What is the two-letter country code for this unit?
      [Unknown]:  CA
    Is CN=Herong Yang, OU=Herong Unit, O=Herong Company, L=Herong City,
    ST=Herong State, C=CA correct?
      [no]:  yes
    
    >keytool -exportcert -alias herong_key -keypass keypass 
    -keystore herong.jks -storepass jkspass -file keytool_crt.der
    
    Certificate stored in file <keytool_crt.der>
    
    >keytool -exportcert -alias herong_key -keypass keypass 
    -keystore herong.jks -storepass jkspass -rfc -file keytool_crt.pem
    
    Certificate stored in file <keytool_crt.pem>
    

    Not that "keytool -exportcert" command applies DER encoding by default. The "-rfc" option is to change it to PEM (RFC 1421) encoding.

    Now I got one certificate generated by "keytool" and stored in two encoding files: keytool_crt.der and keytool_crt.pem. How can I verify that they are really using the correct encoding schemas? I used "OpenSSL" to try to view them as described in the next section.

    "OpenSSL" Verifying "keytool" Certificates

    One way to verify if "keytool" did export my certificate using DER and PEM encoding correctly is to use "OpenSSL" view the encoded certificate files. To do this, I used the "openssl x509" command to view keytool_crt.der and keytool_crt.pem:

    >openssl x509 -in keytool_crt.pem -inform pem -noout -text
    
    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number: 1185636568 (0x46ab60d8)
            Signature Algorithm: dsaWithSHA1
            Issuer: C=CA, ST=Herong State, L=Herong City, ...
            ...
    
    >openssl x509 -in keytool_crt.der -inform der -noout -text
    
    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number: 1185636568 (0x46ab60d8)
            Signature Algorithm: dsaWithSHA1
            Issuer: C=CA, ST=Herong State, L=Herong City, ...
            O=Herong Company, OU=Heron
            ...
    

    What I learned so far:

    • "keytool" can generate self-signed X5.09 version 3 certificates.
    • "keytool" can export certificates with DER and PEM encodings.
    • "OpenSSL" can read certificates generated by "keytool" in both DER and PEM encodings.

    "OpenSSL" Generating Certificates in DER and PEM

    After tested how "keytool" can be used to export certificates in DER and PEM encodings, I decided to try with "OpenSSL" to see if it can generate certificates in the same encodings or not. What I did was to:

    • Run "openssl genrsa" to generate a RSA key pair.
    • Run "openssl req -new -x509" to generate a self-signed certificate and stored it in PEM encoding.
    • Run "openssl x509" to convert the certificate from PEM encoding to DER encoding.

    The test session was recorded below:

    >openssl genrsa -out herong.key -des 1024
    
    Loading 'screen' into random state - done
    Generating RSA private key, 1024 bit long modulus
    .........................++++++
    ...................++++++
    e is 65537 (0x10001)
    Enter pass phrase for herong.key: keypass
    Verifying - Enter pass phrase for herong.key: keypass
    
    >openssl req -new -x509 -key herong.key -out openssl_crt.pem
    -outform pem -config openssl.cnf
    
    Enter pass phrase for herong.key: keypass
    You are about to be asked to enter information that will be 
    incorporated into your certificate request.
    What you are about to enter is what is called a Distinguished 
    Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [CA]:
    State or Province Name (full name) [HY State]:
    Locality Name (eg, city) [HY City]:
    Organization Name (eg, company) [HY Company]:
    Organizational Unit Name (eg, section) [HY Unit]:
    Common Name (eg, YOUR name) [Herong Yang]:
    Email Address [herongyang.com]:
    
    >openssl x509 -in openssl_crt.pem -inform pem 
    -out openssl_crt.der -outform der
    

    Now I got one certificate generated by "OpenSSL" and stored in two encoding files: openssl_crt.der and openssl_crt.pem. How can I verify that they are really using the correct encoding schemas? I used "keytool" to try to import them as described in the next section.

    "keytool" Viewing "OpenSSL" Certificates

    One way to verify the certificate generated by "OpenSSL" and stored in PEM and DER encodings is to view it with the "keytool -printcert" command:

    >keytool -printcert -file openssl_crt.pem
    
    Owner: EMAILADDRESS=herongyang.com, CN=Herong Yang, OU=HY Unit, ...
    Issuer: EMAILADDRESS=herongyang.com, CN=Herong Yang, OU=HY Unit, ...
    Serial number: 0
    Valid from: Sun Apr 1 13:02:22 EDT 2007 until: ...
    Certificate fingerprints:
             MD5:  BF:B8:3A:19:E5:05:CE:CA:8C:F7:05:FA:FE:51:A6:EC
             SHA1: F7:C7:2A:57:73:5E:CE:E5:73:09:13:35:FB:91:CF:27:...
             Signature algorithm name: MD5withRSA
             Version: 3
    
    Extensions:
    ...
    
    >keytool -printcert -file openssl_crt.der
    
    Owner: EMAILADDRESS=herongyang.com, CN=Herong Yang, OU=HY Unit, ...
    Issuer: EMAILADDRESS=herongyang.com, CN=Herong Yang, OU=HY Unit, ...
    Serial number: 0
    Valid from: Sun Apr 1 13:02:22 EDT 2007 until: ...
    Certificate fingerprints:
             MD5:  BF:B8:3A:19:E5:05:CE:CA:8C:F7:05:FA:FE:51:A6:EC
             SHA1: F7:C7:2A:57:73:5E:CE:E5:73:09:13:35:FB:91:CF:27:...
             Signature algorithm name: MD5withRSA
             Version: 3
    
    Extensions:
    ...
    

    What I learned so far:

    • "OpenSSL" can generate self-signed X5.09 version 3 certificates.
    • "OpenSSL" can write certificates with DER and PEM encodings.
    • "keytool" can read certificates generated by "OpenSSL" in both DER and PEM encodings.

    "keytool" Importing "OpenSSL" Certificates

    I also tried to import the certificate generated by "OpenSSL" into "keytoo" keystore files. The "keytool -importcert" command had no trouble reading the certificate in both PEM and DER encodings. My command session is recorded here:

    >keytool -importcert -file openssl_crt.pem
    -keystore herong.jks -storepass jkspass 
    -alias openssl_crt_pem -keypass keypass
    
    Owner: EMAILADDRESS=herongyang.com, CN=Herong Yang, OU=HY Unit, ...
    Issuer: EMAILADDRESS=herongyang.com, CN=Herong Yang, OU=HY Unit, ...
    Serial number: 0
    Valid from: Sun Apr 1 13:02:22 EDT 2007 until: ...
    Certificate fingerprints:
             MD5:  BF:B8:3A:19:E5:05:CE:CA:8C:F7:05:FA:FE:51:A6:EC
             SHA1: F7:C7:2A:57:73:5E:CE:E5:73:09:13:35:FB:91:CF:27:...
             Signature algorithm name: MD5withRSA
             Version: 3
    
    Extensions:
    ...
    Trust this certificate? [no]:  yes
    Certificate was added to keystore
    
    >keytool -importcert -file openssl_crt.der
    -keystore herong.jks -storepass jkspass 
    -alias openssl_crt_der -keypass keypass
    
    Certificate already exists in keystore under alias <openssl_crt_pem>
    Do you still want to add it? [no]:  yes
    Certificate was added to keystore
    
    >keytool -list -keystore herong.jks -store
    pass jkspass
    
    Keystore type: JKS
    Keystore provider: SUN
    
    Your keystore contains 3 entries
    
    openssl_crt_der, Apr 1, 2007, trustedCertEntry,
    Certificate fingerprint (MD5): BF:B8:3A:19:E5:05:CE:CA:8C:F7:05:...
    openssl_crt_pem, Apr 1, 2007, trustedCertEntry,
    Certificate fingerprint (MD5): BF:B8:3A:19:E5:05:CE:CA:8C:F7:05:...
    herong_key, Apr 1, 2007, PrivateKeyEntry,
    Certificate fingerprint (MD5): 5B:44:F1:D7:3D:9F:9E:15:5B:D1:25:...
    

    Wonderful! There was no trouble at for "keytool" to import my self-signed certificate generated by "OpenSSL" into the keystore file.

    Conclusion

    • X.509 defines a digital certificate standard.
    • PEM (Privacy Enhanced Mail) is a certificate encoding schema.
    • DER (Distinguished Encoding Rules) is another certificate encoding schema.
    • "keytool" supports both PEM and DER certificate encodings.
    • "OpenSSL" supports both PEM and DER certificate encodings.

  • 相关阅读:
    Leetcode645.Set Mismatch错误的集合
    Leetcode622.Design Circular Queue设计循环队列
    Leetcode628.Maximum Product of Three Numbers三个数的最大乘积
    Leetcode633.Sum of Square Numbers平方数之和
    Leetcode617.Merge Two Binary Trees合并二叉树
    Leetcode606.Construct String from Binary Tree根据二叉树创建字符串
    SQL Sever实验二 交互式 SQL
    [bzoj2124]等差子序列_线段树_hash
    [bzoj4084][Sdoi2015]双旋转字符串_hash
    [bzoj1708][Usaco2007 Oct]Money奶牛的硬币_动态规划_背包dp
  • 原文地址:https://www.cnblogs.com/kungfupanda/p/2309087.html
Copyright © 2011-2022 走看看