分类: 未分类

  • openssl集成pkcs#11加密engine

    /etc/ssl/openssl.cnf添加以下配置

    [openssl_init]
    providers = provider_sect
    # Load default TLS policy configuration
    ssl_conf = ssl_module
    alg_section = evp_properties
    pkcs11 = pkcs11_section
    
    [pkcs11_section]
    engine_id = pkcs11
    dynamic_path = /usr/lib64/engines-3/pkcs11.so
    MODULE_PATH = /usr/lib64/opensc-pkcs11.so
    init = 0
    

    编译libp11

    git clone https://github.com/OpenSC/libp11
    cd libp11
    autoreconf -fi
    ./configure --prefix=/usr
    make && make install
    ln -sf /usr/lib64/engines-3/libpkcs11.so /usr/lib64/libpkcs11.so
    

    ubuntu上libp11叫libengine-pkcs11-openssl

    执行openssl engine pkcs11 -t后显示以下内容就对了

    (pkcs11) pkcs11 engine
    [ available ]

    但是我执行这个命令的时候70%的概率会报

    /lib64/libpkcs11.so: undefined symbol: OPENSSL_finish

    不过我用pkcs11生成证书时一直报错

    openssl req -engine pkcs11 -new -keyform engine -key ‘pkcs11:model=PKCS%2315;manufacturer=EnterSafe;serial=2c692c97000a0025;token=OpenSC%20Card;id=%45;object=id_4’ -keyform engine -x509 -out cert.pem -text

    Engine “pkcs11” set.
    PKCS#11: Initializing the engine: (null)
    Unable to load module (null)
    PKCS11_get_private_key returned NULL
    Could not find private key from org.openssl.engine:pkcs11:pkcs11:model=PKCS%2315;manufacturer=EnterSafe;serial=2c692c97000a0025;token=OpenSC%20Card;id=%45;object=id_4
    00CE51640C7F0000:error:41000401:libp11:ERR_P11_error:Unable to load PKCS#11 module:p11_load.c:103:
    00CE51640C7F0000:error:40800067:pkcs11 engine:ERR_ENG_error:invalid parameter:eng_back.c:730:
    00CE51640C7F0000:error:13000080:engine routines:ENGINE_load_private_key:failed loading private key:crypto/engine/eng_pkey.c:79:

    Views: 0

  • 智能卡相关术语

    smard card和hsm(hardware security module)本质上一种东西,只是不同的行业叫法不一样。都是通过芯片卡或集成电路提供安全功能。

    相关名词:

    • PKCS#11

      也叫作Cryptoki,是RSA实验室最初发布,现已为OASIS标准。它定义了智能卡与应用程序之间的编程接口。PKCS#11主要在Linux上使用的比较多。

    • CAPI和CNG

      Cryptographic Application Programming Interface也叫作CryptoAPI,Microsoft Cryptography API, MS-CAPI。由Windows NT 4.0引入,作为Cryptographic Service Provider的编程接口。
      CNG的全称是Cryptography API: Next Generation,是由Windows Vista中引入,作为CAPI的升级,在CNG中把provider分为了Key storage provider和Cryptographic Algorithm Providers,前者进行密钥创建,存储及签名,后者提供加密算法。CNG提供了ECC等现代算法的支持,还支持硬件加密模块(HSM,Smard Card)。

    • Cryptographic Service Provider(CSP)/Key storage provider(KSP)/Cryptographic Algorithm Providers(CAP)

      Cryptographic Service Provider是CAPI的实现库,同时提供密钥管理和加解密功能,不支持ECC算法。
      Key storage provider(KSP)为CNG提供密创建和存储功能,默认情况下导入的私钥会保存在Microsoft Software Key Storage Provider中,如果需要指定KSP,则要用certutil命令。
      Cryptographic Algorithm Providers(CAP)为CNG提供加密解功能

      关于CSP/KSP参考:https://www.gradenegger.eu/en/basics-cryptographic-service-provider-csp-and-key-storage-provider-ksp/

    • Microsoft Base Smart Card Cryptographic Service Provider

      这是一个基于CAPI接口的CSP,所以同样不支持ECC算法,用于与Smard Card/HSM交互,它提供了相当于PKCS#11的功能。
      示意图

    • miniDriver

      Microsoft Base Smart Card Cryptographic Service Provider通过miniDriver与Smard Card进行交互,把来自Microsoft Base Smart Card Cryptographic Service Provider的请求转发给Smard Card。
      Smard Card也可以直接实现CSP,KSP,CAP,而不是通过Microsoft Base Smart Card Cryptographic Service Provider中转请求,但是这样对硬件厂商来说会增加成本。miniDriver是为了降低硬件厂商开发CSP的成本。

    • PC/SC (short for Personal Computer/Smart Card)

      是智能卡读卡器与计算机通迅的语义接口,最早为Windows上实现,后来Linux和MacOS也提供了对应的实现。
      WinSCard智能卡函数

    • CCID/ICCD

      CCID (chip card interface device)是芯片卡设备,用于USB读卡器
      ICCD (Integrated Circuit(s) Card Devices),俗称IC卡,用于USB读卡器
      这两种卡都可以通过PC/SC协议通迅

    • FIPS 140

      美国联邦信息处理标准FIPS(Federal Information Processing Standard)是一种针对密码算法模块的安全标准,通过部署FIPS功能,能够提升设备的安全性能。
      FIPS是由美国国家标准和技术研究院制定,由美国商务部批准的针对密码算法安全的标准,它规定了一个安全系统中的密码算法模块应该满足的安全性要求。FIPS 140是FIPS系列标准中针对密码算法模块的安全标准,是进行密码算法模块评测认证的基础标准,共分Level1, Level2, Level3三个等级。
      FIPS 140–2表示的就是FIPS 140 Level 2

    • FIDO(U2F,UAF)

      U2F(Universal 2nd Factor)和UAF(Universal Authentication Framework)是FIDO开发的第一代身份验证标准。
      U2F提供双因素身份验证,但不支持生物识别和无密码认证,主要用于银行。
      UAF提供无密码认证和生物认证

    • FIDO2

      FIDO2是FIDO开发的第二代身份验证标准,是对FIDO(U2F,UAF)的扩展,可以支持单因素和多因素身份验证,也支持无密码和生物识别。FIDO2由WebAuthn和CTAP组成,支持Web应用和本地应用的无密码和多因素身份验证。

    • OTP,HOTP,TOTP

      OTP 是 One-Time Password的简写,表示一次性密码。
      HOTP 是HMAC-based One-Time Password的简写,表示基于HMAC算法加密的一次性密码。
      TOTP 是Time-based One-Time Password的简写,表示基于时间戳算法的一次性密码。
      Yubico OTP,可以在每次触摸yubikey按钮时从键盘键盘一串密码
      Yubico Authenticator可以支持HOTP,TOTP,并与yubikey集成。其实就是提供硬件支持的Gooogle Authenticator,需要在手机或电脑上下载Yubico Authenticator应用。

    • PIV(Personal Identity Verification)

      PIV的规范由FIPS 201定义(2005年),主要用于智能卡身份认证,比如这种门禁卡门禁卡
      当用于Windows登录时则需要提供对应的智能卡CSP,在Linux上用于登录时需要提供PKCS#11接口。

    • OpenPGP

      是一个加密标准,主要用于签名和加密文件,也可以用于签名和加密电子邮件,在Linux上广泛使用。
      OpenPGP也支持使用使用智能卡进行加密,称为OpenPGP card,使用ISO/IEC 7816标准,但是OpenPGP Card只实现了ISO/IEC 7816-4/-8的子集,比PIV卡定义的还要早,一般长这样
      OpenPGP card
      SIM卡
      当然使用的时候是需要读卡器的。

    • OpenSSH

      ssh命令可以通过-I选项指定PKCS#11库来支持智能卡加密,使用PKCS#11时需要使用证书认证。

    Views: 0

  • openssl req生成证书

    • 生成自签名CA证书

      openssl req -x509 -newkey rsa:2048 -keyout ca-key.pem -out ca.pem -noenc

    • 生成证书请求

      openssl req -newkey rsa:2048 -keyout key.pem -out req.pem -noenc

    • 签名证书

      openssl req -x509 -CA ca.pem -CAkey ca-key.pem -in req.pem -copy_extensions copy -out c.pem

    Views: 0

  • OpenSSL FAQ

    • openssl req命令中-key 和 -keyout一起使用时keyout的内容

      keyout的内容与key的输入是一样的

    • openssl req命令中x509v1选项何时生效

      如果使用了扩展则一定会使用V3版本(也就是使用扩展时该选项不生效)。根据我测试的情况openssl3.2以上版本才有此选项,如果想使该选项生效需要指定extensions为空的openssl配置文件(默认配置是有extensions的)

    • openssl x509命令中-extfile选项指定的文件需要指定section name吗

      不需要,会从default section中读取扩展配置

    • copy_extensions选项copy和copyall选项的区别

      copyall会覆盖ca上的现有扩展配置,copy不会

    Views: 0

  • nexus报Nexus was not configured with an encryption key and is using the Default key

    • 创建一个json文件

      data/nexus-key.json

      {
        "active": "my-key",
        "keys": [
          {
            "id": "my-key",
            "key": "some-secret-key"
          }
        ]
      }
      

      把上面的id和key改成自己的

    • 修改nexus的docker-compose.yaml配置

        nexus:
          image: sonatype/nexus3
          restart: always
          volumes:
            - ./data/nexus:/nexus-data
            - ./data/nexus-deploy:/opt/sonatype/nexus/deploy
            - ./data/nexus-key.json:/opt/nexus-key.json
          environment:
            - "NEXUS_SECRETS_KEY_FILE=/opt/nexus-key.json"
      

      执行docker compose up -d

    • 修改生成的key

      打开System > API > Security Management: Secrets Encryption
      点击Try it out,body中输入以下内容

      {
        "secretKeyId": "my-key"
      }
      

      secretKeyId修改为自己的
      最后点击Execute
      也可以直接调用curl命令

      curl -X 'PUT' \
        'https://<your-instance-url>/service/rest/v1/secrets/encryption/re-encrypt' \
        -H 'accept: application/json' \
        -H 'Content-Type: application/json' \
        -H 'NX-ANTI-CSRF-TOKEN: <any-token>' \
        -H 'X-Nexus-UI: true' \
        -d '{
        "secretKeyId": "string",
        "notifyEmail": "string"
      }'
      

    参考:
    https://help.sonatype.com/en/re-encryption-in-nexus-repository.html

    Views: 0

  • powerdns recursor 配置文件转换到yaml格式

    rec_control show-yaml > recursor.yaml
    或者
    rec_control show-yaml path/to/recursor.conf > recursor.yaml

    从recursor5.2开始默认读取yaml格式的配置而不是conf格式。

    Views: 1

  • mysql清除binlog日志压缩磁盘空间

    RESET BINARY LOGS AND GTIDS;
    SHOW BINARY LOGS;
    

    Views: 0

  • openssl-x509

    openssl-x509

    名字

    openssl-x509 – Certificate display and signing command

    概述

    openssl x509 [-help] [-in filename|uri] [-passin arg] [-new] [-x509toreq] [-req] [-copy_extensions arg] [-inform DER|PEM] [-vfyopt nm:v] [-key filename|uri] [-keyform DER|PEM|P12|ENGINE] [-signkey filename|uri] [-out filename] [-outform DER|PEM] [-nocert] [-noout] [-dateopt] [-text] [-certopt option] [-fingerprint] [-alias] [-serial] [-startdate] [-enddate] [-dates] [-subject] [-issuer] [-nameopt option] [-email] [-hash] [-subject_hash] [-subject_hash_old] [-issuer_hash] [-issuer_hash_old] [-ext extensions] [-ocspid] [-ocsp_uri] [-purpose] [-pubkey] [-modulus] [-checkend num] [-checkhost host] [-checkemail host] [-checkip ipaddr] [-set_serial n] [-next_serial] [-not_before date] [-not_after date] [-days arg] [-preserve_dates] [-set_issuer arg] [-set_subject arg] [-subj arg] [-force_pubkey filename] [-clrext] [-extfile filename] [-extensions section] [-sigopt nm:v] [-badsig] [-digest] [-CA filename|uri] [-CAform DER|PEM|P12] [-CAkey filename|uri] [-CAkeyform DER|PEM|P12|ENGINE] [-CAserial filename] [-CAcreateserial] [-trustout] [-setalias arg] [-clrtrust] [-addtrust arg] [-clrreject] [-addreject arg] [-rand files] [-writerand file] [-engine id] [-provider name] [-provider-path path] [-propquery propq]
    

    描述

    此命令是一个多用途证书处理命令。它可用于打印证书信息、将证书转换为各种形式、编辑证书信任设置、从头开始或从证书请求生成证书,然后自行签名或像“micro CA”一样签名。
    生成的证书带有 X.509 version 3扩展。除非另有说明,否则密钥标识符扩展将包含。
    由于有大量选项,它们将分为不同的部分。

    命令选项

    Input, Output, and General Purpose Options

    输入,输出和通用选项

    • -help

      帮助

    • -in filename

      输入证书或请书请求(-req指定时)文件的位置,默认为std input。不能与-new选项一起使用

    • -passin arg

      读取证书或密钥文件的密码

    • -new

      从头创建证书,不使用-in读取证书或证书请求,所以不能与-in和-req选项共存。-set_subject option是必须的(subject代表公钥所属的实体),通过-force_pubkey指定公钥(此时是对这个公钥签名)。默认是自签名(自己的公钥)且使用-key (or -signkey)提供的私钥。

    • -x509toreq

      生成证书请求而不是证书,自签名时必须指定 -key (or -signkey) option用于提供自签名私钥,对应的公钥会保存在subjectPKInfo字段。
      默认情况下,不会复制输入证书中包含的 X.509 扩展。可以使用 -extfile 选项指定要添加的 X.509 扩展。

    • -req

      默认情况下,输入时需要证书。使用此选项则需要 PKCS#10 证书请求,该请求必须正确自签名(防止篡改)。
      默认情况下,不会复制请求中包含的 X.509 扩展。可以使用 -extfile 选项指定要添加的 X.509 扩展。

    • -copy_extensions arg

      当使用-x509toreq证书转请求或-req请求转证书时确定复制X.509扩展的方式。arg为none时忽略所有扩展,为copy或copyall时复制所有扩展,还可以通过-ext选项进一步控制要复制哪些扩展。

    • -inform DER|PEM

      输入的csr文件格式,默认首先尝试pem格式

    • -vfyopt nm:v

      验证签名时指定签名算法的选项,不同的签名算法选项也不同

    • -key filename|uri

      此选项提供用于签署新证书或证书请求的私钥。除非提供 -force_pubkey,否则该私钥对应的公钥将放在新证书或证书请求中,从而产生自签名。
      此选项不能与 -CA 选项一起使用。
      把issuer name设置为subject name(即使是自签名)。除非提供 -preserve_dates 选项,否则它将有效期开始日期设置为当前时间,并将结束日期设置为由 -days 选项确定的值。开始日期和结束日期也可以通过选项 -not_before 和 -not_after 明确提供。

    • -signkey filename|uri

      这个选项是-key的别名

    • -keyform DER|PEM|P12|ENGINE

      读取key的格式

    • -out filename

      输出文件位置,不指定时输出到终端

    • -outform DER|PEM

      输出文件格式,默认PEM

    • -nocert

      不打印证书,其余部分按下面选项指定的内容打印

    • -noout

      只打印下面选项指定的内容

    Certificate Printing Options

    证书打印选项
    注意:-alias 和 -purpose 选项也是打印选项,但在“Trust Settings”部分中描述。

    • -dateopt

      指定日期输出格式。值为:rfc_822 和 iso_8601。默认为 rfc_822。

    • -text

      以文本形式打印出证书。打印的完整详细信息包括public key, signature algorithms, issuer and subject DN名称, serial number, 任意 extensions以​​及任何trust settings。

    • -certopt option

      为-text自定议打印格式,多个选项可以指定多次也可以用豆号分隔,具体语法参考”Text Printing Flags

    • -fingerprint

      计算和打印证书(DER编码)的指纹,每个证书的指纹是唯一的

    • -alias

      打印证书的alias(nickname),如果有的话。

    • -serial

      打印证书序列号

    • -startdate

      打印证书生效起始日期

    • -enddate

      打印证书失效日期

    • -dates

      打印证书的起始和失效日期

    • -subject

      Prints the subject name.

    • -issuer

      Prints the issuer name.

    • -nameopt option

      指定subject or issuer names 的显示方式. 参考:openssl-namedisplay-options for details.

    • -email

      Prints the email address(es) if any.

    • -hash

      同-subject_hash

    • -subject_hash

      打印subject name的hash,用于生成索引在目录中通过subject name查找证书。

    • -subject_hash_old

      打印subject name的hash,使用OpenSSL 1.0中的旧hash算法

    • -issuer_hash

      Prints the “hash” of the certificate issuer name.

    • -issuer_hash_old

      Prints the “hash” of the certificate issuer name using the older algorithm as used by OpenSSL before version 1.0.0.

    • -ext extensions

      以文本形式打印出证书扩展。也可用于限制要复制的扩展。扩展用逗号分隔的字符串指定,例如“subjectAltName, subjectKeyIdentifier”。请参阅 x509v3_config .

    • -ocspid

      打印subject name 和 public key 的 OSCP hash.

    • -ocsp_uri

      Prints the OCSP responder address(es) if any.

    • -purpose

      对证书扩展执行测试并输出结果. For a more complete description see “Certificate Extensions” in openssl-verification-options.

    • -pubkey

      Prints the certificate’s SubjectPublicKeyInfo block in PEM format.

    • -modulus

      This option prints out the value of the modulus of the public key contained in the certificate.

    Certificate Checking Options

    • -checkend arg

      检查如果证书在未来arg秒钟内过期返回非0值,否者返回0值。

    • -checkhost host

      Check that the certificate matches the specified host.

    • -checkemail email

      Check that the certificate matches the specified email address.

    • -checkip ipaddr

      Check that the certificate matches the specified IP address.

    Certificate Output Options

    • -set_serial n

      指定证书序列号
      Specifies the serial number to use. This option can be used with the -key, -signkey, or -CA options. If used in conjunction with the -CA option the serial number file (as specified by the -CAserial option) is not used.

      The serial number can be decimal or hex (if preceded by 0x).

    • -next_serial

      当前证书序列号加1
      Set the serial to be one more than the number in the certificate.

    • -not_before date

      指定证书生效起始日期
      证书生效的起始日期。格式是YYMMDDHHMMSSZYYYYMMDDHHMMSSZ,秒SS和时区Z是必须存在的,可以指定today

      Cannot be used together with the -preserve_dates option.

    • -not_after date

      指定证书过期时间
      证书生效的起始日期。格式是YYMMDDHHMMSSZYYYYMMDDHHMMSSZ,秒SS和时区Z是必须存在的,可以指定today

      Cannot be used together with the -preserve_dates option. This overrides the option -days.

    • -days arg

      指定证书从现在起算有效天数,默认为30。
      不能与选项 -preserve_dates 一起使用。如果设置了选项 -not_after,则明确的到期日期优先。

    • -preserve_dates

      签署证书时,保留任何输入证书的“notBefore”和“notAfter”日期,而不是将其调整为当前时间和持续时间。不能与选项 -days、-not_before 和 -not_after 一起使用。

    • -set_issuer arg

      创建证书时指定issuer的DN名,具体格式参考-set_subject

    • -set_subject arg

      创建证书时指定主题的DN,arg的格式为/type0=value0/type1=value1/type2=...
      特殊字符用\转义,允许使用空格,单个/指定空的DN,可以用+代表/作为两个RDN之间的分隔符,例如/DC=org/DC=OpenSSL/DC=users/UID=123456+CN=John Doe,/C=CN/ST=Shanghai/L=Shanghai/CN=hetao/emailAddress=tao@hetao.me/
      This option can be used with the -new and -force_pubkey options to create a new certificate without providing an input certificate or certificate request.

    • -subj arg

      This option is an alias of -set_subject.

    • -force_pubkey filename

      创建证书时使用指定证书的公钥,而不是输入证书或请求中以及-key选项指定的公钥(与私钥对应)。
      如果filename是一个私钥文件则使用其公钥部分。
      与 -new and -set_subject 一起使用可以直接生成包含指定公钥和subject的证书.
      This option is also useful for creating self-issued certificates that are not self-signed, for instance when the key cannot be used for signing, such as DH.

    • -clrext

      默认情况下,将证书转换为新证书时,所有证书扩展都会保留。
      转换证书或证书请求时,-clrext 选项会阻止从源接管任何扩展。无论如何,在生成证书请求时,都不会接管主体标识符或授权密钥标识符扩展。

    • -extfile filename

      在创建证书或请求时filename指定要添加的X.509扩展,

    • -extensions section

      为-extfile指定section名称,如果没有指定则直接从default section查看,也会从default section中的extensions变量指定的section中查找。
      See the x509v3_config(5) manual page for details of the extension section format.
      Unless specified otherwise, key identifier extensions are included as described in x509v3_config(5).

    • -sigopt nm:v

      签名算法的选项,可以多次使用,不同算法有不同的选项

    • -badsig

      写入一个无效签名,用于测试

    • -digest

      要使用的digest算法。这会影响使用消息摘要的任何签名或打印选项,例如 -fingerprint、-key 和 -CA 选项。可以使用 openssl-dgst(1) 命令支持的任何摘要。如果未指定,对于-fingerprint选项则使用 SHA1,对于签名算法的通常为 SHA256。

    Micro-CA Options

    微型CA(模拟一个小型CA服务器)

    • -CA filename|uri

      指定签名用的 CA 证书,使用这个选项时,它的行为就是一个微型CA:CA证书的subject name会为成新证书的issuer,然后使用CA的私钥签证。
      这个选项不能与-key (or -signkey)一起使用。与-req选项一起使用时会读入CSR,否者会读入证书,另外与-new一起使用时会从头创建证书。

    • -CAform DER|PEM|P12,

      CA证书的格式

    • -CAkey filename|uri

      设置CA的私钥,指定的私钥必须与CA证书匹配,如果没有指定这个选项则-CA指定的CA证书中必须包括私钥。

    • -CAkeyform DER|PEM|P12|ENGINE

      The format for the CA key; unspecified by default. See openssl-format-options(1) for details.

    • -CAserial filename

      设置要使用的 CA 序列号文件。
      使用此选项和 ​​-CA 选项创建证书时,证书序列号存储在给定文件中。此文件由一行组成,其中包含偶数个十六进制数字,以及上次使用的序列号。读取此数字后,该数字将递增并使用,然后更新文件。
      默认文件名由 CA 证书文件基本名称和附加的 .srl 后缀组成。例如,如果 CA 证书文件名为 mycacert.pem,则它会找到一个名为 mycacert.srl 的序列号文件。
      如果指定了 -CA 选项,并且未提供 -CAserial> 或 -CAcreateserial,并且默认序列号文件不存在,则会生成一个随机数;这是推荐的做法。

    • -CAcreateserial

    ​ ​-CA 选项一起使用,如果不存在 CA 序列号文件,则创建该文件。将生成一个随机数用于证书,并保存到如上所述(-CAserial filename)确定的序列号文件中。

    Trust Settings

    可信设置。

    受信任证书是一种普通证书,它附带了几个附加信息,例如证书的允许和禁止用途以及可能的“alias”(nickname)。
    通常,在验证证书时,必须至少有一个证书是“受信任的”。默认情况下,受信任证书必须存储在本地,并且必须是根 CA:任何以此 CA 结尾的证书链都可以用于任何目的(受支持的)。
    信任设置目前仅用于根 CA。它们允许更精细地控制根 CA 的用途。例如,CA 可能被信任用于 SSL 客户端,但不被信任用于 SSL 服务器。
    有关信任设置含义的更多信息,请参阅 openssl-verification-options
    OpenSSL 的未来版本将识别任何证书上的信任设置:而不仅仅是根 CA。

    可信证书包含在—–BEGIN TRUSTED CERTIFICATE—–分隔符中,用于openssl对证书的用途进行验证。
    这个可能主要用于OpenSSL的SSL会话中信任服务端证书,比如s_client命令,相当于OpenSSL专用的受信任根证书列表。

    • -trustout

      标记任意PEM证书输出为受信任的。普通和受信任证书都可以作为输入但是默认情况下任何可信设置都会丢弃。使用这个选项后可以输出受信任证书。如果只是修改证书的信任设置仍然会输出一个信任证书。

    • -setalias arg

      设置证书的alias,这将允许使用nickname引用一个证书,例如”Steve’s Certificate”

    • -clrtrust

      清除证书的允许用途

    • -addtrust arg

      添加受信任的证书用途。此处可以使用任何对象名称,但目前仅定义了 clientAuth、serverAuth、emailProtection 和 anyExtendedKeyUsage。从 OpenSSL 1.1.0 开始,最后一次在被拒绝时阻止所有用途,在受信任时启用所有用途。其他 OpenSSL 应用程序可能会定义其他用途。

    • -clrreject

      请理证书所有禁止用途。

    • -addreject arg

      添加禁止的证书用途,与-addtrust option的格式相同.

    Generic options

    通用选项

    • -rand files, -writerand file

      指定随机数状态保存的文件,读取之前的随机数生成器状态并写入当前状态用于下次执行的时候继续使用。现在OpenSSL已经从操作系统中读取熵源,这个选项不再需要,只是在特殊情况下才有用。

    • -engine id

      指定engine id,这个选项已经废弃

    • -provider name

      指定provider name

    • -provider-path path

      provider的路径

    • -propquery propq

      provider中的属性

    Text Printing Flags

    除了自定义名称打印格式外,还可以使用 -certopt 选项(当存在-text选项时)自定义打印的实际字段。默认行为是打印所有字段。

    • compatible

      Use the old format. This is equivalent to specifying no printing options at all.

    • no_header

      Don’t print header information: that is the lines saying “Certificate” and “Data”.

    • no_version

      Don’t print out the version number.

    • no_serial

      Don’t print out the serial number.

    • no_signame

      Don’t print out the signature algorithm used.

    • no_validity

      Don’t print the validity, that is the notBefore and notAfter fields.

    • no_subject

      Don’t print out the subject name.

    • no_issuer

      Don’t print out the issuer name.

    • no_pubkey

      Don’t print out the public key.

    • no_sigdump

      Don’t give a hexadecimal dump of the certificate signature.

    • no_aux

      Don’t print out certificate trust information.

    • no_extensions

      Don’t print out any X509V3 extensions.

    • ext_default

      Retain default extension behaviour: attempt to print out unsupported certificate extensions.

    • ext_error

      Print an error message for unsupported certificate extensions.

    • ext_parse

      ASN1 parse unsupported extensions.

    • ext_dump

      Hex dump unsupported extensions.

    • ca_default

      The value used by openssl-ca, equivalent to no_issuer, no_pubkey, no_header, and no_version.

    NOTES

    The conversion to UTF8 format used with the name options assumes that T61Strings use the ISO8859-1 character set. This is wrong but Netscape and MSIE do this as do many certificates. So although this is incorrect it is more likely to print the majority of certificates correctly.
    名称选项(-subject,-issuer)会转换为UTF8 格式转换,假定 T61Strings 使用的是 ISO8859-1 字符集。这是错误的,但 Netscape 和 MSIE 以及许多证书都这样做。因此,尽管这是不正确的,但更有可能正确打印大多数证书。

    -email 选项搜索主题名称和主题备用名称扩展名。只会打印出唯一的电子邮件地址:它不会多次打印相同的地址。

    自 OpenSSL 3.2 起,生成的证书带有 X.509 版本 3(不再支持低于V3的版本?),并且默认包含key identifier扩展。

    Views: 0

  • openssl-req

    openssl-req

    名字

    openssl-req – PKCS#10 certificate request and certificate generating command

    概述

    openssl req [-help] [-inform DER|PEM] [-outform DER|PEM] [-in filename] [-passin arg] [-out filename] [-passout arg] [-text] [-pubkey] [-noout] [-verify] [-modulus] [-new] [-newkey arg] [-pkeyopt opt:value] [-noenc] [-nodes] [-key filename|uri] [-keyform DER|PEM|P12|ENGINE] [-keyout filename] [-keygen_engine id] [-digest] [-config filename] [-section name] [-x509] [-x509v1] [-CA filename|uri] [-CAkey filename|uri] [-not_before date] [-not_after date] [-days n] [-set_serial n] [-newhdr] [-copy_extensions arg] [-extensions section] [-reqexts section] [-addext ext] [-precert] [-utf8] [-reqopt] [-subject] [-subj arg] [-multivalue-rdn] [-sigopt nm:v] [-vfyopt nm:v] [-batch] [-verbose] [-quiet] [-nameopt option] [-rand files] [-writerand file] [-engine id] [-provider name] [-provider-path path] [-propquery propq]

    描述

    这个命令用于生成证书请求文件,生成的证书请求文件符合PKCS#10标准,证书请求是申请证书的第一步。
    同时这个命令也能创建自签名证书。

    选项说明

    • -help

      帮助

    • -inform DER|PEM

      输入的csr文件格式,默认首先尝试pem格式

    • -outform DER|PEM

      输出CSR格式,无默认值

    • -in filename

      输入文件的位置,默认为std input,除非指定了-x509 or -CA。也就是说-x509或-CA必须通过-in选项从文件读取公钥
      只有未指定创建选项时 (-new or -newkey or -precert) 才会读取证书请求.
      req命令是用来生成证书请求的,-in参数有什么用呢?共实req命令不光能生成证书请求还能读取和验证证书请求,以及根据证书请求签署证书,这时候就需要-in参数。

    • -sigopt nm:v

      指定签名算法

    • -vfyopt nm:v

      验证签名时指定签名算法的选项,不同的签名算法选项也不同

    • -passin arg

      输入文件的密码来源,可以是pass:password,env:var,file:pathname,fd:number,stdin

    • -passout arg

      输出文件的密码来源

    • -out filename

      输出文件名,通常是证书请求或证书(-x509或-ca)

    • -text

      打印csr的内容到屏幕上并且后面跟CSR正文,当指定-out参数时则是写入到文件中

      用法如下:
      openssl req -in ca.csr -text

    • -subject

      打印CSR的subject到屏幕上

    • -noout

      阻止输出CSR正文,当不指定-text都打印参数时则什么也不输出,指定-text参数时只会输出text。

    • -modulus

      打印csr的公钥模数

    • -verify

      验证csr中的自签名是否正确,如果失败立即退出,如果正确会显示Certificate request self-signature verify OK。

    • -new

      生成新的证书请求,它会提示输入相关字段的值。提示输入的字段在配置文件中指定。
      如果没有指定-key则根据配置文件生成私钥或者指定-newkey and -pkeyopt选项,否者会使用2048位的RSA私钥。

    • -newkey arg

      指定生成私钥的参数
      在没有指定-key的时候用于生成私钥,可以与-new一起使用创建csr,也可以与-x509一起使用来创建证书。
      arg参数有一下几种格式:

      • [rsa:]nbits

        指定rsa算法及位数,rsa是可选的

      • param:file

        指定参数文件,只有dsa,dh,dhx,ec算法支持参数文件。

      • algname[:file]

        指定具体算法和参数文件,只有dsa,dh,dhx,ec算法支持参数文件

      • dsa:filename

        指定dsa算法和参数文件

      • ec:filename

        指定ec算法和参数文件。

      • gost2001:filename

        指定gost2001算法和参数文件,gost是俄罗斯政府推出的签名算法。

      参数文件是用openssl genpkey命令生成的,对于dsa,dh,dhx算法,参数文件已经包含了私钥的各种参数值,对于ec算法,参数文件就是曲线的OID标识符,可以是各种类型的曲线。当不指定参数文件时可以通过-pkeyopt指定算法参数

    • -pkeyopt opt:value

      如果有多个参数可以指定多次,参数的具体值参考openssl genpkey命令

    • -key filename|uri

      指定私钥文件,用于签名新的证书或证书请求。如果不指定-in的话会把-key指定的私钥的公钥放入证书或证书请求中形成自签名证书或证书请求。
      指定-CA选项时这个这个选项会被覆盖(-CA可以生成非自签名证书)

    • -keyform DER|PEM|P12|ENGINE

      私钥的格式

    • -keyout filename

      写入私钥到指定的文件名,私钥可以是-newkey创建的,也可以是-key读入的。如果生成了新私钥且未指定-keyout则会输出到标准输出。如果-keyout和-key选项都没有指定则使用配置文件中的default_keyfile选项,如果存在的话。(If neither the -keyout option nor the -key option are given then the filename specified in the configuration file with the default_keyfile option is used, if present.)。

    • -noenc

      不加密私钥

    • -nodes

      已废弃,同-noenc

    • -digest

      签名用的摘要算法,只要是openssl dgst支持的算法都可以,会覆盖配置文件中指定的摘要算法。一些公钥算法只支持特定的摘要算法,这个选项不生效。例如DSA仅支持SHA1。

    • -config

      指定备用的配置文件,用于替代默认的openssl.cnf

    • -section name

      指定该命令的section name,默认是req

    • -subj arg

      指定主题的DN,arg的格式为/type0=value0/type1=value1/type2=...
      特殊字符用\转义,允许使用空格,单个/指定空的DN,可以用+代表/作为两个RDN之间的分隔符,例如/DC=org/DC=OpenSSL/DC=users/UID=123456+CN=John Doe,/C=CN/ST=Shanghai/L=Shanghai/CN=hetao/emailAddress=tao@hetao.me/

    • -multivalue-rdn

      废弃选项,不起作用

    • -x509

      使用这个选项时生成证书而不是证书请求,当指定-CA选项是-x509是默认指定的。
      使用-x509选项时如果没有指定-in选项则隐含包括-new选项。
      如果没有指定-CA则会生成自签名证书
      如果-in选项指定了证书请求则将其转换为证书,否者从头创建请书请求。(If an existing request is specified with the -in option, it is converted to a certificate; otherwise a request is created from scratch.)
      如果没有指定-set_serial则使用一个大随机数作为证书序列号
      除非使用 -copy_extensions 选项,否则不会从证书请求输入文件中复制 X.509 扩展。

      可以在配置文件中指定要添加的 X.509 扩展,可以使用 -config 和 -extensions 选项,和/或使用 -addext 选项指定配置文件。
      除非给出 -x509v1,否则生成的证书将带有 X.509 版本 3。除非另有说明,否则将包含密钥标识符扩展属性,如 x509v3_config(5) 中所述。也就是说密钥标识符是默认就包含的V3扩展。

    • -x509v1

      使用X509 V1版本,使用-x509时这是一个隐含选项。如果使用了扩展则一定会使用V3版本(也就是使用扩展时该选项不生效)。
      根据我测试的情况openssl3.2以上版本才有此选项,如果想使该选项生效需要指定extensions为空的openssl配置文件(默认配置是有extensions的)

    • -CA filename|uri

      指定签名用的CA证书,CA证书的subject DN会放入签署证书的issuer DN字段,并使用-CAkey指定的私钥生成签名。

    • -CAkey filename|uri

      签署证书的CA私钥,必须与-CA指定的证书中的公钥匹配,如果不指定则-CA指定的证书中必须包含私钥(If this option is not provided then the key must be present in the -CA input).

    • -not_before date

      证书生效的起始日期。格式是YYMMDDHHMMSSZYYYYMMDDHHMMSSZ,秒SS和时区Z是必须存在的,可以指定today

    • -not_after date

      证书的截止日期。格式是YYMMDDHHMMSSZYYYYMMDDHHMMSSZ,秒SS和时区Z是必须存在的,可以指定today,会覆盖 -days options。

    • -days n

      指定证书生效的天数。始终从今天开始算而不管-not_before的值,如果指定-not_after则-days不生效。n是正整 数,默认值为30天。

    • -set_serial n

      指定自签名证书的证书序列号,可以指定10进制数或以0x开头的16进制数。不指定的时候会使用一个大随机数。

    • copy_extensions arg

      确定如何处理证书请求中的扩展。如果设置为 none 或此选项不存在,则将忽略证书请求中的扩展,而不会将其复制到证书中。如果设置为 copy,则请求中存在但尚未存在的任何扩展都将复制到证书中。如果设置为 copyall,则请求中的所有扩展都将复制到证书中:如果扩展已存在于证书中,则首先将其删除。

    • -extensions section, -reqexts section

      用于覆盖生成证书请求或证书时X.509 V3扩展的section name,允许使用多次。

    -reqexts是-extensions的别名
    – -addext ext

    添加一个指定的V3扩展属性到证书或证书请求中。ext的格式是`key=value`,这个选项可以指定多次,但是扩展的`key`(不是密钥,是键)不能重复使用.
    如果指定的key与配置文件中的扩展OID相同则会覆盖配置文件中的值(每个key都有一个oid)。
    
    • -precert

      生成一个预证书,这个预计书会推带一个poison extension扩展,然后把这个预证书提交到SCT服务器,然后从SCT服务器返回SCT,然后SCT可以包含到最终签发的证书或配置到http服务器上。
      poison扩展是RFC6962定义的一个扩展(不同于X.509 V3),现已被废弃。新的RFC 9162(Certificate Transparency Version 2.0)不再使用这个扩展。
      这个是为了支持google的Certificate Transparency计划,确保CA签署的证书不被篡改并对CA签署的的所有证书进行公示,避免CA乱发证书。
      这个选项已经隐含了-new选项。

      国内厂商开发了支技国密算法的证书透明(基于RFC6962),详见:https://zotrus.com/blog/what-is-certificate-transparency_what-is-sm2-certificate-transparency.html
      其实CT V2.0已经支持所有在IANA注册的TLS SignatureScheme签名Log,https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-signaturescheme

      在线的SCT日志查询网站:
      https://myssl.com/ct_check.html
      https://ctlogsearch.com/searchdomainname
      chrome自2018年开始要求所有证书支持SCT

    • -utf8

      所有字段值都用utf-8编码解释(默认是ASCII),无论是来自终端还是配置文件的字段。

    • -reqopt option

      自定义-text 输出的格式,可以豆号分隔多个选项也可以指定多次-reqopt。option的值参见:https://docs.openssl.org/3.4/man1/openssl-x509/#text-printing-flags

    • -newhdr

      在输出的证书请求文件的行和尾添加”NEW”,某些CA和软件需要。添加后BEGIN变成BEGIN NEW

    • -batch

      非交互模式

    • -verbose

      执行时输出更多的信息

    • -quiet

      输出更少的信息,这在批处理和使用管道时很方便,尤其是密钥生成期间抑制进度.的输出。

    • -keygen_engine id

      指定生成密钥的engine

    • -nameopt option

      指定如何显示subject和issuer中的DN,具体参考:https://docs.openssl.org/3.4/man1/openssl-namedisplay-options/#name-format-option-arguments

    • -rand files, -writerand file

      指定随机数状态保存的文件,读取之前的随机数生成器状态并写入当前状态用于下次执行的时候继续使用。现在OpenSSL已经从操作系统中读取熵源,这个选项不再需要,只是在特殊情况下才有用。

    • -engine id

      指定engine id,这个选项已经废弃

    • -provider name

      指定provider name

    • -provider-path path

      provider的路径

    • -propquery propq

      provider中的属性

    配置文件格式

    配置选项是在配置文件的req section中指定的,也可以用-section指定备用section name,如果section中没有指定值则也会在配置文件的default section中搜索。(As with all configuration files, if no value is specified in the specific section then the initial unnamed or default section is searched too.这句话说的有歧议,经过我反复测试,这句话的真正意思是如果指定的section中没有的属性也会在default section去查找,value应该是setcion中的filed或property, 而the specific section指的是默认的req section或用-section指定的其它section,也就是说default section中的配置是对所有命令都有效的)
    比如这样配置(把req section的字段都移到了default section):

    config_diagnostics = 1
    openssl_conf = openssl_init
    default_bits        = 4096
    default_keyfile     = privkey.pem
    distinguished_name  = req_distinguished_name
    attributes      = req_attributes
    x509_extensions = v3_ca # The extensions to add to the self signed cert
    [ req ]
    ... 移到了上面 ...
    [ openssl_init ]
    oid_section = oids
    providers = providers
    alg_section = evp_properties
    ssl_conf = ssl_configuration
    engines = engines
    random = random
    
    • input_password, output_password

      读取和写入私钥的加密密码,对应-passin和-passout选项

    • default_bits

      指定rsa密钥的位数

    • default_keyfile

      私钥文件的输出位置,对应-keyout选项

    • oid_file

      oid定义文件,每行一个

    • oid_section

      指定定义oid的section

    • RANDFILE

      对应-rand files选项

    • encrypt_key

      加密私钥的密码,对应-encrypt_rsa_key

    • default_md

      指定摘要算法,对应-digest

    • string_mask

      指定允许的字符串编码

      • utf8only

        only UTF8Strings are used (this is the default value)

      • pkix

        any string type except T61Strings

      • nombstr

        any string type except BMPStrings and UTF8Strings

      • default

        any kind of string type

      utf8only是默认值,如果遇到不兼容utf8的软件可以指定nombstr

    • req_extensions

      包含在证书请求中的X.509 V3扩展,对应-reqexts (or -extensions)选项

    • x509_extensions

      包含在证书中的X.509 V3扩展,对应-reqexts (or -extensions)选项

    • prompt

      yes or no
      设为no的时候从文件读取而不是从终端读取DN信息
      会影响distinguished_name或attributes的格式。

    • utf8

      yes or no
      对应-utf8

    • attributes

      这个section包含任何需要终端输入的属性
      其格式与 distinguished_name 相同。通常,这些可能包含 challengePassword 或 unstructuredName 类型。它们目前被 OpenSSL req命令忽略,但一些 CA 可能需要它们。
      ${attributes}_default可以指定属性的默认值

    • distinguished_name

      生成证书或证书请求的DN信息,${distinguished_name}_default可以指定默认的DN信息

      配置文件示例

      “`openssl cnf
      [ req ]
      default_bits = 2048
      default_keyfile = keyfile.pem
      distinguished_name = req_distinguished_name
      attributes = req_attributes
      prompt = no
      output_password = mypass

      [ req_distinguished_name ]
      countryName = Country Name (2 letter code)
      countryName_default = CN
      countryName_min = 2
      countryName_max = 2

      stateOrProvinceName = State or Province Name (full name)
      stateOrProvinceName_default = Shanghai

      localityName = Locality Name (eg, city)
      localityName_default = Shanghai

      0.organizationName = Organization Name (eg, company)
      0.organizationName_default = Hangshu

      <h1>we can do this but it is not needed normally :-)</h1>

      <h1>1.organizationName = Second Organization Name (eg, company)</h1>

      <h1>1.organizationName_default = World Wide Web Pty Ltd</h1>

      organizationalUnitName = Organizational Unit Name (eg, section)
      organizationalUnitName_default = R&D

      commonName = Common Name (e.g. server FQDN or YOUR name)
      commonName_default = t.he
      commonName_max = 64

      emailAddress = Email Address
      emailAddress_default = t.he@hang-shu.com
      emailAddress_max = 64

      [ req_attributes ]
      challengePassword = A challenge password

      “`

    DISTINGUISHED NAME AND ATTRIBUTE SECTION FORMAT

    DISTINGUISHED NAME和attribute sections(应该指的是定义DN的section)有两种不同的格式(根据prompt选项)。如果将prompt选项设置为否,则这些部分仅由field names and values组成:例如,

    CN=My Name
    OU=My Organization
    emailAddress=someone@somewhere.org
    

    这允许外部程序(例如基于 GUI 的程序)生成包含所有字段名称和值的模板文件,并将其传递给此命令。此类配置文件的示例包含在 EXAMPLES 部分中。
    或者,如果prompt选项不存在或未设置为 no,则文件包含字段提示信息。它由以下形式的行组成:

    fieldName="prompt"
    fieldName_default="default field value"
    fieldName_min= 2
    fieldName_max= 4
    

    “fieldName” 是正在使用的字段名称,例如 commonName(或 CN)。”prompt”字符串用于询问用户输入相关详细信息。如果用户未输入任何内容,则使用默认值;如果没有默认值,则省略该字段。如果用户仅输入”.”字符,则如果存在默认值,仍然可以省略字段。

    输入的字符数必须介于 fieldName_min 和 fieldName_max 限制之间:根据所使用的字段,可能会有其他限制(例如,countryName 只能是两个字符长,并且必须适合 PrintableString)。

    某些字段(例如 organizationName)可以在 DN 中使用多次。这会带来问题,因为配置文件无法识别两次出现的相同名称。为了避免此问题,如果 fieldName 包含一些字符,后面跟一个”.”字符,则会忽略这些字符。因此,例如,可以通过将其称为“1.organizationName”来输入第二个 organizationName。

    实际允许的字段名称是任何object identifier短名称或长名称。这些名称被编译到 OpenSSL 中,包括常用值,例如 commonName、countryName、localityName、organizationName、organizationalUnitName、stateOrProvinceName。此外,还包括 emailAddress 以及 name、surname、givenName、initials 和 dnQualifier。
    关于这些DN中的RDN值的object identifier及短/长名称,可以通过命令openssl list -objects| grep "2\.5\.4"查看,不过这样看的不完整,也可以通过微软的这个文档查看名称属性

    可以使用配置文件中的 oid_file 或 oid_section 选项定义附加object identifiers。任何附加字段都将被视为 DirectoryString。

    Views: 0

  • openssl-pkcs12

    openssl-pkcs12

    名字

    openssl-pkcs12 – PKCS#12 file command

    概要

    openssl pkcs12 [-help] [-passin arg] [-passout arg] [-password arg] [-twopass] [-in filename|uri] [-out filename] [-nokeys] [-nocerts] [-noout] [-legacy] [-engine id] [-provider name] [-provider-path path] [-propquery propq] [-rand files] [-writerand file]

    PKCS#12 input (解析PKCS12文件) options: [-info] [-nomacver] [-clcerts] [-cacerts]

    [-aes128] [-aes192] [-aes256] [-aria128] [-aria192] [-aria256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-noenc] [-nodes]

    PKCS#12 output (输出PKCS12文件) options:

    [-export] [-inkey filename|uri] [-certfile filename] [-passcerts arg] [-chain] [-untrusted filename] [-CAfile file] [-no-CAfile] [-CApath dir] [-no-CApath] [-CAstore uri] [-no-CAstore] [-name name] [-caname name] [-CSP name] [-LMK] [-keyex] [-keysig] [-keypbe cipher] [-certpbe cipher] [-descert] [-macalg digest] [-iter count] [-noiter] [-nomaciter] [-maciter] [-macsaltlen] [-nomac] [-jdktrust usage]

    描述

    此命令允许创建和解析 PKCS#12 文件(有时称为 PFX 文件)。PKCS#12 文件被多个程序使用,包括 Netscape、MSIE 和 MS Outlook。

    通用选项

    有很多选项,其中一些选项的含义取决于是在创建还是解析 PKCS#12 文件。默认情况下,将解析 PKCS#12 文件。可以使用 -export 选项创建 PKCS#12 文件(见下文)。PKCS#12 导出时的加密和 MAC 选项(例如 -certpbe 和 -iter)以及许多其他选项(例如 -chain)仅与 -export 相关。相反,输出(读取并显示)PKCS#12 时有关私钥加密的选项仅在未给出 -export 选项时相关。
    默认加密算法为 AES-256-CBC,使用 PBKDF2 进行密钥派生。
    当加载涉及 RC2-40-CBC 等的旧版 PKCS#12 文件时遇到问题时,请尝试使用 -legacy 选项,如果需要,还可以使用 -provider-path 选项。

    • -help

      Print out a usage message.

    • -passin arg

      输入文件的密码,用于读取加密的私钥

    • -passout arg

      输出文件的密码

    • -password arg

      和 -export一起时等于 -passout, 其它情况等于 -passin.

    • -twopass

      完整性和加密密码分开输入,大部分软件不支持两个密码是不同的,这种情况会导致文件无法读取。不能与-password,-passin,-passout一起使用。

    • -nokeys

      不导出私钥

    • -nocerts

      不导出证书

    • -noout

      此选项禁止所有凭证输出,因此仅验证输入。

    • -legacy

      使用旧式操作模式并自动加载旧式提供程序。如果未在系统范围内安装 OpenSSL,则还需要使用例如 -provider-path ./providers 或设置环境变量 OPENSSL_MODULES 以指向可以找到提供程序的目录。
      在旧式模式下,证书加密的默认算法是 RC2_CBC 或 3DES_CBC,具体取决于构建中是否启用了 RC2 密码。私钥加密的默认算法是 3DES_CBC。如果未指定旧式选项,则不会加载旧式提供程序,证书和私钥的默认加密算法都是 AES_256_CBC,并使用 PBKDF2 进行密钥派生。

    • -engine id

      See “Engine Options” in openssl(1). This option is deprecated.

    • -provider name

    • -provider-path path

    • -propquery propq

      See “Provider Options” in openssl(1), provider(7), and property(7).

    • -rand files, -writerand file

      See “Random State Options” in openssl(1) for details.

    PKCS#12 input (parsing) options

    • -in filename|uri

      这指定输入文件名或 URI。默认情况下使用标准输入。如果没有 -export 选项,则表示解析 PKCS#12 文件。有关使用 -export 选项的信息,请参阅“PKCS#12 输出(导出)选项”部分。

    • -out filename

      写入证书和私钥的文件名,默认为标准输出。它们都以 PEM 格式写入。

    • -info

      输出有关 PKCS#12 文件结构、使用的算法和迭代计数的附加信息。

    • -nomacver

      不验证完整性MAC

    • -clcerts

      仅输出客户证书(not CA certificates).

    • -cacerts

      仅输出CA证书(不包括客户证书)

    • -aes128, -aes192, -aes256

      使用AES加密输出(PEM格式)的私钥

    • -aria128, -aria192, -aria256

      使用ARIA加密输出(PEM格式)的私钥

    • -camellia128, -camellia192, -camellia256

      使用Camellia加密输出的私钥

    • -des

      使用DES加密输出的私钥

    • -des3

      使用3DES加密输出的私钥

    • -idea

      使用 IDEA 加密输出的私钥

    • -noenc

      不加密私钥

    • -nodes

      同-noenc,已废弃

    PKCS#12 output (export) options

    • -export

      指定创建而不是解析PKCS#12文件

    • -out filename

      写入的PKCS#12文件,默认是标准输出

    • -in filename|uri

      这指定输入文件名或 URI。默认情况下使用标准输入。使用 -export 选项,这是一个包含证书和密钥的文件,或引用通过引擎访问的密钥的 URI。文件中凭证的顺序无关紧要,但应该有一个私钥及其对应的证书。如果存在其他证书,它们也将包含在 PKCS#12 输出文件中。

    • -inkey filename|uri

      PKCS12 输出的私钥输入。如果未指定此选项,则输入文件(-in 参数)必须包含私钥。如果未使用引擎,则参数将被视为文件。如果使用 -engine 选项或 URI 具有前缀 org.openssl.engine:,则 URI 的其余部分将被视为给定引擎的密钥标识符。

    • -certfile filename

      如果给出了 -export 选项,则包含额外证书的输入文件将被添加到 PKCS#12 输出。

    • -passcerts arg

      输入证书的密码,比如-certfile,-untrusted指定的证书

    • -chain

      如果存在此选项,则会构建最终实体证书的证书链并将其包含在 PKCS#12 输出文件中。如果未提供密钥,则最终实体证书是从 -in 文件读取的第一个证书,否则是第一个与给定密钥匹配的证书。标准 CA trust store用于链构建,以及使用 -untrusted 选项提供的任何不受信任的 CA 证书。

    • -untrusted filename

      可用于构建链的不受信任证书的输入文件,仅当使用 -export 选项创建 PKCS#12 文件并且同时指定 -chain 选项时才相关。实际上属于链的任何证书都将添加到输出中。

    • -CAfile file, -no-CAfile, -CApath dir, -no-CApath, -CAstore uri, -no-CAstore

      See “Trusted Certificate Options” in openssl-verification-options(1) for details.

    • -name friendlyname

      PKCS12中证书的friendlyName,相当于证书的别名。导入软件通常会在列表中框中显示。

    • -caname friendlyname

      指定其他证书的“friendlyName”。此选项可多次使用,按证书出现的顺序指定所有证书的名称。Netscape 会忽略其他证书的friendlyName,而 MSIE 会显示这些名称。

    • -CSP name

      Write name as a Microsoft CSP(Cloud Solution Provider program?) name. The password source for the input, and for encrypting any private keys that are output. For more information about the format of arg see openssl-passphrase-options(1).

    • -LMK

      Add the “Local Key Set” identifier to the attributes.
      标识密钥仅用于本地应用?

    • -keyex|-keysig

      指定私钥用于密钥交换或仅用于签名。此选项仅由 MSIE 和类似的 MS 软件解释。通常,“export grad”软件只允许使用 512 位 RSA 密钥进行加密,但允许使用任意长度的密钥进行签名。-keysig 选项标记密钥仅用于签名。仅签名密钥可用于 S/MIME 签名、Authenticode(ActiveX 控件签名)和 SSL 客户端身份验证,但是,由于存在错误,只有 MSIE 5.0 及更高版本支持使用仅签名密钥进行 SSL 客户端身份验证。

    • -keypbe alg, -certpbe alg

      这些选项允许选择用于加密私钥和证书的算法。可以使用任何 PKCS#5 v1.5 或 PKCS#12 PBE 算法名称(有关详细信息,请参阅“注释”部分)。如果指定了密码名称(如 openssl list -cipher-algorithms 输出),则它将与 PKCS#5 v2.0 一起使用。出于互操作性原因,建议仅使用 PKCS#12 算法。
      指定NONE值则禁用私钥和证书加密。
      一般默认即可,除非需要使用特殊的加密算法。

    • -descert

      使用3DES 加密证书。默认情况下,私钥和证书使用 AES-256-CBC 加密,除非使用“-legacy”选项。如果将“-descert”与“-legacy”一起使用,则私钥和证书均使用3DES 加密。

    • -macalg digest

      指定MAC摘要算法,如果不指定则使用SHA256

    • -iter count

      This option specifies the iteration count for the encryption key and MAC. The default value is 2048.

      To discourage attacks by using large dictionaries of common passwords the algorithm that derives keys from passwords can have an iteration count applied to it: this causes a certain part of the algorithm to be repeated and slows it down. The MAC is used to check the file integrity but since it will normally have the same password as the keys and certificates it could also be attacked.

    • -noiter, -nomaciter

      By default both encryption and MAC iteration counts are set to 2048, using these options the MAC and encryption iteration counts can be set to 1, since this reduces the file security you should not use these options unless you really have to. Most software supports both MAC and encryption iteration counts. MSIE 4.0 doesn’t support MAC iteration counts so it needs the -nomaciter option.

    • -maciter

      This option is included for compatibility with previous versions, it used to be needed to use MAC iterations counts but they are now used by default.

    • -macsaltlen

      This option specifies the salt length in bytes for the MAC. The salt length should be at least 16 bytes as per NIST SP 800-132. The default value is 8 bytes for backwards compatibility.

    • -nomac

      不要尝试提供 MAC 完整性。这对于 FIPS 提供商很有用,因为 PKCS12 MAC 需要 PKCS12KDF,而这不是经批准的 FIPS 算法,并且不受 FIPS 提供商支持。

    • -jdktrust

      以与 Java 密钥库使用兼容的格式导出 pkcs12 文件。此选项接受一个字符串参数,指示要授予与其关联的证书的信任 oid 名称。当前仅定义了“anyExtendedKeyUsage”。请注意,由于 Java 密钥库不接受具有受信任证书和密钥对的 PKCS12 文件(不能包含私钥),因此使用此选项意味着设置 -nokeys 选项

    注意

    尽管有大量选项,但大多数选项很少使用。对于 PKCS#12 文件解析,只需要使用 -in 和 -out,对于创建 PKCS#12 文件,还需要使用 -export 和 -name。

    如果不存在 -clcerts、-cacerts 或 -nocerts 选项,则所有证书将按照它们在输入 PKCS#12 文件中出现的顺序输出。不能保证第一个存在的证书是与私钥相对应的证书。某些试图获取私钥和​​相应证书的软件可能会假设文件中的第一个证书是与私钥相对应的证书,但情况可能并非总是如此。使用 -clcerts 选项将通过仅输出与私钥相对应的证书来解决此问题。如果需要 CA 证书,则可以使用 -nokeys -cacerts 选项将它们输出到单独的文件中,以仅输出 CA 证书。

    -keypbe 和 -certpbe 算法允许指定私钥和证书的精确加密算法。通常情况下,默认设置就足够了,但有时软件无法处理3DES 加密的私钥,则可以使用选项 -keypbe PBE-SHA1-RC2-40 将私钥加密减少到 40 位 RC2。所有算法的完整描述包含在 openssl-pkcs8(1) 中。

    1.1 版之前的密码包含非 ASCII 字符,采用不合规方式编码,这限制了与 Windows 的互操作性。但切换到符合标准的密码编码会导致访问受损坏编码保护的旧数据出现问题。因此,在读取数据时甚至会尝试使用旧编码。如果您在生产应用程序中使用 PKCS#12 文件,建议您转换数据,因为这种启发式读取策略(heuristic approach)不是 MT-safe的,其唯一目标是使用此命令促进数据升级(兼容旧数据)。

    示例

    从p12文件导出nginx使用的证书文件
    需要server证书是证书链中的第一个证书,如果不是需要手动调整顺序
    openssl pkcs12 -in .\ejbca.ca.com.p12 -noenc -nokeys -out fullchain.cer
    openssl pkcs12 -in .\ejbca.ca.com.p12 -noenc -nocerts -out ejbca.hetao.me.key
    转换jks格式到pkcs12格式
    keytool -importkeystore -srckeystore server.jks -destkeystore server.p12 -deststoretype pkcs12
    要用openssl处理keytool生成的p12文件需要加-legacy选项

    Views: 0