• grpc、https、oauth2等认证专栏实战6:openssl配置文件openssl.cnf介绍


    已发表的技术专栏(订阅即可观看所有专栏)
    0  grpc-go、protobuf、multus-cni 技术专栏 总入口

    1  grpc-go 源码剖析与实战  文章目录

    2  Protobuf介绍与实战 图文专栏  文章目录

    3  multus-cni   文章目录(k8s多网络实现方案)

    4  grpc、oauth2、openssl、双向认证、单向认证等专栏文章目录


    1、如何使用指定的openssl.cnf配置文件呢?

    可以在 openssl 命令行上使用 -config 选项、也可以使用 OPENSSL_CONF 环境变量

    2、默认openssl.cnf配置文件的位置?

    此文件的默认位置

    • RedHat系=/etc/pki/tls/openssl.cnf
    • Debian系=/etc/ssl/openssl.cnf

    3、openssl.cnf主要包括几部分?

    openssl.cnf的文件内容包括了三大部分:

    • 默认的文件配置、
    • 证书请求配置
    • 证书签发配置。
      除此之外还可以配置X.509证书的扩展项,在使用OpenSSL函数库时也可以使用配置机制

    4、openssl.cnf 属性解释?x509证书属性解释

    4.1、openssl.cnf里配置属性的语法介绍

    ########
    # 语法 #
    ########
    #
    # 变量 = 值
    #
    # 语法很简单,一看就懂,但是有几点需要说明:
    # 1. 字符串值最好使用双引号界定,并且其中可以使用"\n","\r","\t","\\"这些转义序列。
    # 2. 可以使用 ${变量名} 的形式引用同一字段中的变量,使用 ${字段名::变量名} 的形式引用其它字段中的变量。
    # 3. 可以使用 ${ENV::环境变量} 的形式引用操作系统中定义的环境变量,若变量不存在则会导致错误。
    # 4. 可以在默认字段定义与操作系统环境变量同名的变量作为默认值来避免环境变量不存在导致的错误。
    # 5. 如果在同一字段内有多个相同名称的变量,那么后面的值将覆盖前面的值。
    # 6. 可以通过 ".include = 绝对路径" 语法或 OPENSSL_CONF_INCLUDE 环境变量引入其他配置文件(*.cnf)。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.2、具体属性介绍

    [注意]这个示范文件的内容并不是默认设置。
    最新版本 https://github.com/openssl/openssl/blob/master/apps/openssl.cnf

    ###############################
    # OpenSSL-1.1.1g 配置文件示范 #
    ###############################
    
    ############
    # 默认字段 #
    ############
    #[ default ]
    # 此部分是默认字段,必须放在所有字段之前。小节头"[default]"是可选的。
    # 读取配置文件时,会首先根据字段名称去寻找相应的配置段,如果没有找到则会使用这里的默认字段。
    
    # 定义 HOME 的默认值,防止操作系统中不存在 HOME 环境变量。
    HOME = /tmp
    
    # 默认的随机数种子文件,对应 -rand 命令行选项。
    RANDFILE = /dev/random
    
    # 扩展对象定义
    # 如果没有在 OpenSSL 命令行中定义X.509证书的扩展项,那么就会从下面对扩展对象的定义中获取。
    # 定义方法有两种,第一种(反对使用)是存储在外部文件中,也就是这里"oid_file"变量定义的文件。
    #oid_file = ${ENV::HOME}/.oid
    # 第二种是存储在配置文件的一个字段中,也就是这里"oid_section"变量值所指定的字段。
    oid_section = new_oids
    
    # 要将此配置文件用于 "openssl x509" 命令的 "-extfile" 选项,
    # 请在此指定包含 X.509v3 扩展的小节名称
    #extensions =
    # 或者使用一个默认字段中仅包含 X.509v3 扩展的配置文件
    
    [ new_oids ]
    # 添加可以被 'ca', 'req', 'ts' 命令使用的扩展对象。格式如下:
    # 对象简称 = 对象数字ID
    # 下面是一些增强型密钥用法(extendedKeyUsage)的例子
    
    # 任何目的(一次性包含所有增强用法)
    anyExtendedUsage = 2.5.29.37.0
    # 服务器身份验证
    serverAuth = 1.3.6.1.5.5.7.3.1
    # 客户端身份验证
    clientAuth = 1.3.6.1.5.5.7.3.2
    # 代码签名
    codeSigning = 1.3.6.1.5.5.7.3.3
    # 安全电子邮件
    emailProtection = 1.3.6.1.5.5.7.3.4
    # IPSec 终端系统
    ipsecEndSystem = 1.3.6.1.5.5.7.3.5
    # IPSec 隧道
    ipsecTunnel = 1.3.6.1.5.5.7.3.6
    # IPSec 用户
    ipsecUser = 1.3.6.1.5.5.7.3.7
    # 时间戳
    timeStamping = 1.3.6.1.5.5.7.3.8
    # OCSP 签名
    OCSPSigning = 1.3.6.1.5.5.7.3.9
    # IPSec 密钥交换
    ipsecIKE = 1.3.6.1.5.5.7.3.17
    # 微软个人代码签名
    msCodeInd = 1.3.6.1.4.1.311.2.1.21
    # 微软商业代码签名
    msCodeCom = 1.3.6.1.4.1.311.2.1.22
    # 微软信任列表签名
    msCTLSign = 1.3.6.1.4.1.311.10.3.1
    # 微软加密文件系统
    msEFS = 1.3.6.1.4.1.311.10.3.4
    
    ####################
    ##  证书请求配置  ##
    ####################
    # 在申请证书之前通常需要首先生成符合 PKCS#10 标准的证书请求。
    # openssl 的 req 命令实现了产生证书请求的功能,其相关选项的默认值就来自于这里的设置。
    # 证书请求的配置涉及多个字段,包括一个基本字段(req)和几个附属字段。
    
    ##### 证书请求配置的"基本字段",其它附属字段都以它为入口 #####
    [ req ]
    
    # 读取输入密钥文件时的口令,如果未设置那么将会提示输入。对应 -passin 命令行选项。
    #input_password = secret
    # 保存输出密钥文件时的口令,如果未设置那么将会提示输入。对应 -passout 命令行选项。
    #output_password = secret
    
    # 生成的证书中RSA密钥的默认长度,取值是2的整数次方。建议不小于2048。对应 -newkey 命令行选项。
    default_bits = 2048
    
    # 保存生成的密钥文件的默认文件名。对应 -keyout 命令行选项。
    default_keyfile = privkey.pem
    
    # 生成的密钥文件是否采用口令保护,可设为yes或no(对应 -nodes 命令行选项)。
    encrypt_key = yes
    
    # 签名默认使用的信息摘要算法,所有 dgst 命令都可以使用(sha256, sha3-256, sha512, sha3-512, ...)
    # 此处的设置相当于在命令行上使用 -sha256 选项(对应于"-digest")。
    default_md = sha256
    
    # 为一些字段设置默认的字符串类型,比如证书请求中的城市和组织名称。可能的取值和解释如下:
    # default: 包含了 PrintableString, T61String, BMPString 三种类型
    # pkix  : 包含了 PrintableString, BMPString 两种类型
    # utf8only: 只使用 UTF8 字符串。推荐使用这个,这样可以完美的包含任意字符。
    # nombstr : 包含了 PrintableString, T61String 两种类型
    string_mask = utf8only
    
    # 证书请求扩展的字段名,该扩展字段定义了要加入到证书请求中的一系列 X.509v3 扩展项。
    # 对应 -reqexts 命令行选项。
    req_extensions = v3_req
    
    # 生成自签名根证书时要使用的证书扩展项字段名,该扩展字段定义了要加入到根证书中的一系列 X.509v3 扩展项。
    # 对应 -extensions 命令行选项。
    x509_extensions = v3_ca
    
    # 如果设为no,那么 req 指令将直接从配置文件中读取证书字段的信息,而不是提示用户输入。
    prompt = yes
    
    # 如果设为yes,那么命令行与配置文件中的字符串都将按照UTF-8编码看待。默认值no表示仅使用ASCII编码。
    # 对应 -utf8 命令行选项。
    utf8 = yes
    
    # 定义证书请求属性的字段名,该扩展字段定义了证书请求的一些属性,但openssl的证书签发工具并不使用它们。
    #attributes = req_attributes
    
    # 定义输入用户信息选项的"特征名称"字段名,该扩展字段定义了多项用户信息。
    distinguished_name = req_distinguished_name
    
    ##### 要加入到证书请求中的一系列 X.509v3 扩展项,对应 -addext 命令行选项 #####
    [ v3_req ]
    
    # 基本约束(该证书是否为CA证书)。"CA:FALSE"表示非CA证书(不能签发其他证书的"叶子证书")。
    basicConstraints = CA:FALSE
    
    # 密钥用法:防否认(nonRepudiation)、数字签名(digitalSignature)、密钥加密(keyEncipherment)。
    # 密钥协商(keyAgreement)、数据加密(dataEncipherment)、仅加密(encipherOnly)、仅解密(decipherOnly)
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    
    # 增强型密钥用法(参见"new_oids"字段):服务器身份验证、客户端身份验证、时间戳。
    extendedKeyUsage = critical, serverAuth, clientAuth, timeStamping
    
    # 使用者备用名称(email, URI, DNS, RID, IP, dirName)
    # 例如,DNS常用于实现泛域名证书、IP常用于绑定特定的IP地址、"copy"表示直接复制
    #subjectAltName = DNS:www.example.com, DNS:example.com, DNS:*.example.net, IP:192.168.7.1, IP:13::17, email:copy
    
    # OCSP必须装订(OCSP Must-Staple)
    1.3.6.1.5.5.7.1.24 = DER:30:03:02:01:05
    # 如果是使用openssl 1.1.0或更高的版本,可以这样设置:
    tlsfeature = status_request
    
    #### 生成自签名证书(RootCA)时使用的 X.509v3 证书扩展项,对应 -addext 命令行选项 #####
    [ v3_ca ]
    
    # 基本约束(该证书是否为CA证书)。"CA:TRUE"表示是CA证书(可签发其他证书)。
    # "pathlen:N"后缀表示允许签发下级CA证书的深度("0"表示禁止签发下级CA证书),"critical"表示关键扩展。
    # 例如"critical,CA:TRUE, pathlen:0"表示禁止签发下级CA证书(仅能签发"叶子证书")。
    basicConstraints = critical,CA:TRUE
    
    # 密钥用法:证书撤销列表签名(cRLSign)、证书签发(keyCertSign)、数字签名(digitalSignature)
    keyUsage = cRLSign, keyCertSign, digitalSignature
    
    # 增强型密钥用法(参见"new_oids"字段):OCSP 签名
    extendedKeyUsage = OCSPSigning
    
    # 使用者密钥标识符(根据RFC3280规范自动生成)
    subjectKeyIdentifier = hash
    
    # 颁发机构密钥标识符("always"表示始终包含)
    authorityKeyIdentifier = keyid:always,issuer
    
    # 跳过 OCSP 检查
    noCheck = ignored
    
    ##### "特征名称"字段包含了用户的标识信息,对应 -subj 命令行选项 #####
    [ req_distinguished_name ]
    countryName = CN  #必须是两字母国家代码
    stateOrProvinceName = 省份或直辖市
    localityName = 城市
    organizationName = 组织名或公司名
    organizationalUnitName = 部门名称
    commonName = 全限定域名或个人姓名
    emailAddress = Email地址
    
    ####################
    ##  证书签发配置  ##
    ####################
    # openssl 的 ca 命令实现了证书签发的功能,其相关选项的默认值就来自于这里的设置。
    # 这个字段只是通过唯一的 default_ca 变量来指定默认CA主配置字段的入口(-name 命令行选项的默认值)
    [ ca ]
    default_ca = CA_default
    
    ##### 默认CA主配置字段,(★)标记表示必需项 #####
    [ CA_default ]
    
    # 保存所有信息的文件夹,这个变量只是为了给后面的变量使用
    dir = /etc/pki/CA
    
    #(★)存放新签发证书的默认目录,证书名就是该证书的系列号,后缀是.pem 。对应 -outdir 命令行选项。
    new_certs_dir = $dir/newcerts
    
    #(★)存放CA自身证书的文件名。对应 -cert 命令行选项。
    certificate = $dir/cacert.pem
    
    #(★)存放CA自身私钥的文件名。对应 -keyfile 命令行选项。
    private_key = $dir/private/cakey.pem
    
    # 新签发的证书默认有效期,以天为单位。依次对应 -days , -startdate , -enddate 命令行选项。
    default_days = 365
    # 新证书默认的生效日期,如果未设置则使用签发时的时间,格式为:YYMMDDHHNNSSZ(年月日时分秒Z)
    #default_startdate = 080303223344Z
    # 新证书默认的失效日期,格式为:YYMMDDHHNNSSZ(年月日时分秒Z)
    #default_enddate = 090303223344Z
    
    # 从当前CRL(证书撤销列表)到下次CRL发布的间隔小时数或天数。依次对应 -crlhours , -crldays 命令行选项。
    #default_crl_hours = 72
    default_crl_days = 30
    
    # 签发新证书以及CRL时默认的摘要算法,所有 dgst 命令都可以使用(sha256, sha3-256, sha512, sha3-512, ...)
    #(★)此处的设置相当于在命令行上使用 -sha256 选项(对应于"-digest")。
    default_md = sha256
    
    #(★)保存已签发证书的文本数据库文件,初始时可为空。
    database = $dir/index.txt
    
    # 同一个"subject"是否只能创建一个证书,默认值为 yes 但建议设为 no 以方便根CA自签名( -selfsign )。
    unique_subject = no
    
    #(★)签发证书时使用的序列号文本文件,里面必须包含下一个可用的16进制数字。
    serial = $dir/serial
    
    # 存放当前CRL编号的文件
    crlnumber = $dir/crlnumber
    
    # 定义X.509证书扩展项的字段。对应 -extensions 命令行选项。
    x509_extensions = usr_cert
    
    # 定义生成CRL时需要加入的扩展项字段。对应 -crlexts 命令行选项。
    #crl_extensions = crl_ext
    
    # 通常,证书签发的特种名称(DN)域的各个参数顺序与证书策略的参数顺序一致。
    # 但是,如果这里设为yes则保持与证书请求中的参数顺序一致。对应 -preserveDN 命令行选项。
    preserve = no
    
    # 默认值为 yes ,设为 no 表示从证书的DN中删除 EMAIL 字段。对应 -noemailDN 命令行选项。
    email_in_dn = yes
    
    # 强烈建议不要使用它,对应 -msie_hack 命令行选项。
    #msie_hack =
    
    #(★)定义用于证书请求DN域匹配策略的字段,用于决定CA要求和处理证书请求提供的DN域的各个参数值的规则。
    # 对应 -policy 命令行选项。
    policy  = policy_match
    
    # 当用户需要确认签发证书时可读证书DN域的显示格式。可用值与 x509 指令的 -nameopt 选项相同。
    name_opt = ca_default
    # 当用户需要确认签发证书时证书域的显示格式。
    # 可用值与 x509 指令的 -certopt 选项相同,不过 no_signame 和 no_sigdump 总被默认设置。
    cert_opt  = ca_default
    
    # 是否将证书请求中的扩展项信息加入到证书扩展项中去。取值范围以及解释:
    # none: 忽略所有证书请求中的扩展项
    # copy: 将证书扩展项中没有的项目复制到证书中
    # copyall: 将所有证书请求中的扩展项都复制过去,并且覆盖证书扩展项中原来已经存在的值。
    # 此选项的主要用途是允许证书请求提供例如 subjectAltName 之类扩展的值。
    copy_extensions = copy
    
    ##### 为签发的证书设置扩展项 #####
    [ usr_cert ]
    
    # 基本约束(该证书是否为CA证书)。"CA:FALSE"表示非CA证书(不能签发其他证书的"叶子证书")。
    #basicConstraints = CA:FALSE
    
    # 一般只能给常规证书这些用途
    #keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    
    # PKIX工作组推荐将使用者与颁发机构的密钥标识符包含在证书中
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid,issuer
    
    ##### 证书请求信息的匹配策略 #####
    # 变量名称是DN域对象的名称,变量值可以是:
    # match: 该变量在证书请求中的值必须与CA证书相应的变量值完全相同,否则拒签。
    # supplied: 该变量在证书请求中必须提供(值可以不同),否则拒签。
    # optional: 该变量在证书请求中可以存在也可以不存在(相当于没有要求)。
    # 除非preserve=yes或者在ca命令中使用了-preserveDN,否则在签发证书时将删除匹配策略中未提及的对象。
    [ policy_match ]
    countryName  = match
    stateOrProvinceName = optional
    localityName = optional
    organizationName = optional
    organizationalUnitName = optional
    commonName  = supplied
    emailAddress  = optional
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286

    5、自定义opensssl.cnf例子

    openssl证书配置过程

    新增DNS域名

    更新dns例子reqext、extensions、extfile

    6、参考文档

    http://www.jinbuguo.com/linux/openssl_install.html
    https://www.cnblogs.com/f-ck-need-u/p/6091027.html

    下一篇文章

      openssl配置文件openssl.cnf介绍

  • 相关阅读:
    数据挖掘原理与算法
    vue-cli 下的 CSS Modules
    用Unity做一个萌萌哒游戏(附资源)
    SQLServer下载与安装
    写点程序员离职的心得
    Git 常用命令
    BiliBiliToolPro Docker部署+Server酱推送
    Kyligence李栋:从数据湖到指标中台,提升数据分析ROI
    前端编程应该了解的数据结构——栈、队列
    【开发经验】通知气泡实现思路
  • 原文地址:https://blog.csdn.net/u011582922/article/details/126220411