OpenSSL主配置文件openssl.cnf

openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.htmlhtml


雖然說配置文件不少設置不用修改就能直接使用,可是瞭解它是配置openssl相關事項所必須的。並且要實現複雜多功能,必然要對配置相關了然於心。node

1.man config

該幫助文檔說明了openssl.cnf以及一些其餘輔助配置文件的規範、格式及讀取方式。後文中的全部解釋除非特別指明,都將以openssl.cnf爲例。git

[root@xuexi ~]# whatis config

Config (3pm) - access Perl configuration information

config (5ssl) - OpenSSL CONF library configuration files

Config::Extensions (3pm) - hash lookup of which core extensions were built

config.guess [config] (1) - guess the build system triplet

config [openssl] (5ssl) - OpenSSL CONF library configuration files

config.sub [config] (1) - validate and canonicalize a configuration triplet

config-util (5) - Common PAM configuration file for configuration utilities

所以直接man config便可。算法

配置文件openssl.cnf中分紅了多個段落,每一個段落都使用中括號包圍的方式"[section_name]"來標識。section_name能夠包含字母、數字和下劃線。dom

第一個section被解釋爲默認段落,默認段落通常(是通常不是必定)沒有[section_name]標識。當搜索某一個section時,將首先搜索有名稱的section,而後還會搜索默認section,若是沒有找到匹配的有名稱的section,將直接讀取默認section。測試

該配置文件中使用#開頭來書寫註釋信息。每一個section包含一些name以及它們的值,格式爲name=value,name和value的前導或尾隨空格被忽略,若是要包含空格應該使用引號包圍。網站

在name部分能夠包含字母、數字以及一些標點符號,如「.」「,」「;」或「_」。ui

在value部分可使用變量擴展。在每一個section中能夠定義變量,每一個section的變量默認只做用於當前section,變量引用的格式有兩種"$var"或"${var}"。若是想要引用其餘section中的變量或name,可使用"$section_name::name"或"${section::name}"。this

在value部分能夠指定爲其餘section的指針。請參看下文的示例。加密

可使用反斜線「\」轉義,包括轉義引號字符以及反斜線自己,也可使用「\」來進入多行書寫模式。另外\n、\r、\b、\t是可以被識別的。

如下爲書寫示例,注意其中的特性。

/* This is the default section.*/
HOME=/temp
RANDFILE= ${ENV::HOME}/.rnd
configdir=$ENV::HOME/config

[ section_one ]
default_value = section_three
/* Also you can refer section_name by character "@" */
default_value = @section_three

[ section_two ]
/* We are now in section two. *//* Quotes permit leading and trailing whitespace */
any = " any variable name "
other = A string that can \
cover several lines \
by including \\ characters
message = Hello World\n

[section_three]
greeting = 
$section_one::message

 2./etc/pki/tls/openssl.cnf

該文件主要設置了證書請求、簽名、crl相關的配置。主要相關的僞命令爲ca和req。對於x509不用該配置文件。

該文件從功能結構上分爲4個段落:默認段、ca相關的段、req相關的段、tsa相關的段。每一個段中都以name=value的格式定義。

該文件中沒有被引用的段被視爲忽略段,不會起到任何做用。

每一個段中能夠書寫哪些name以及它們的意義,能夠man相關命令,如man ca能夠查看ca相關段能夠書寫的name,man req能夠查看req相關段能夠書寫的name。

(1).默認段

第一段是默認段,通常沒有section_name,但不是必定沒有,能夠自定義有名稱的。

默認段中定義的是一些公共屬性,當搜索一個給定名稱的段時,將首先搜索有名稱的段,當搜索不到匹配的段後會搜索默認段。

如下是默認段的內容。

HOME = .

RANDFILE = $ENV::HOME/.rnd

oid_section = new_oids

僅定義了當前目錄變量,以及隨機數的文件路徑變量。

至於最後一行的oid_section=new_oids表示指向[new_oids]段。如下爲new_oids段。oid是是對象標識符,幹啥的我也不知道,反正沒改過它。

[ new_oids ]

tsa_policy1 = 1.2.3.4.1

tsa_policy2 = 1.2.3.4.5.6

tsa_policy3 = 1.2.3.4.5.7

(2).ca相關的段

這些段定義ca相關的控制選項。如下爲ca相關段內容。其中黃底加粗黑字的爲必須項,黃底加粗紅字的爲建議設置或建議修改的項。

####################################################################
[ ca ]
default_ca  = CA_default        /*The default ca section*/
####################################################################
[ CA_default ]

dir     = /etc/pki/CA    /* Where everything is kept */
                         /*  #### 這是第一個openssl目錄結構中的目錄 */
certs       = $dir/certs /* Where the issued certs are kept(已頒發的證書路徑,即CA或自籤的) */
                         /* #### 這是第二個openssl目錄結構中的目錄,但非必須 */
crl_dir     = $dir/crl   /* Where the issued crl are kept(已頒發的crl存放目錄) */
                         /*  #### 這是第三個openssl目錄結構中的目錄*/
database    = $dir/index.txt /* database index file */
#unique_subject = no     /* 設置爲yes則database文件中的subject列不能出現重複值 */
                         /* 即不能爲subject相同的證書或證書請求籤名*/
                         /* 建議設置爲no,但爲了保持老版本的兼容性默認是yes */
new_certs_dir = $dir/newcerts /* default place for new certs(未來頒發的證書存放路徑) */
                             /* #### 這是第四個openssl目錄結構中的目錄 */
certificate = $dir/cacert.pem  /* The A certificate(CA本身的證書文件) */
serial      = $dir/serial      /* The current serial number(提供序列號的文件)*/
crlnumber   = $dir/crlnumber   /* the current crl number(當前crl序列號) */
crl     = $dir/crl.pem         /* The current CRL(當前CRL) */
private_key = $dir/private/cakey.pem  /* The private key(簽名時須要的私鑰,即CA本身的私鑰) */
RANDFILE    = $dir/private/.rand      /* private random number file(提供隨機數種子的文件) */
x509_extensions = usr_cert  /* The extentions to add to the cert(添加到證書中的擴展項) */
/* 如下兩行是關於證書展現格式的,雖非必須項,但推薦設置。通常就以下格式不用修改 */
name_opt    = ca_default        /* Subject Name options*/
cert_opt    = ca_default        /* Certificate field options */
/* 如下是copy_extensions擴展項,需謹慎使用 */
# copy_extensions = copy  /* 生成證書時擴展項的copy行爲,可設置爲none/copy/copyall */
                          /* 不設置該name時默認爲none */
                          /* 建議簡單使用時設置爲none或不設置,且強烈建議不要設置爲copyall */
# crl_extensions    = crl_ext
default_days    = 365   /* how long to certify for(默認的證書有效期) */
default_crl_days= 30    /* how long before next CRL(CRL的有效期) */
default_md  = default   /* use public key default MD(默認摘要算法) */
preserve    = no        /* keep passed DN ordering(Distinguished Name順序,通常設置爲no */
                        /* 設置爲yes僅爲了和老版本的IE兼容)*/
policy      = policy_match /* 證書匹配策略,此處表示引用[ policy_match ]的策略 */
/* 證書匹配策略定義了證書請求的DN字段(field)被CA簽署時和CA證書的匹配規則 */
/* 對於CA證書請求,這些匹配規則必需要和父CA徹底相同 */
[ policy_match ]
countryName = match     /* match表示請求中填寫的該字段信息要和CA證書中的匹配 */
stateOrProvinceName = match
organizationName    = match
organizationalUnitName  = optional  /* optional表示該字段信息可提供可不提供 */
commonName      = supplied    /* supplied表示該字段信息必須提供 */
emailAddress        = optional
/* For the 'anything' policy*/
/* At this point in time, you must list all acceptable 'object' types. */

/* 如下是沒被引用的策略擴展,只要是沒被引用的都是被忽略的 */
[ policy_anything ]
countryName     = optional
stateOrProvinceName = optional
localityName        = optional
organizationName    = optional
organizationalUnitName  = optional
commonName      = supplied
emailAddress        = optional 
/* 如下是添加的擴展項usr_cert的內容*/
[ usr_cert ]
basicConstraints=CA:FALSE   /* 基本約束,CA:FALSE表示該證書不能做爲CA證書,即不能給其餘人頒發證書*/
/* keyUsage = critical,keyCertSign,cRLSign  # 指定證書的目的,也就是限制證書的用法*/
/* 除了上面兩個擴展項可能會修改下,其他的擴展項別管了,以下面的 */
nsComment  = "OpenSSL Generated Certificate" 
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

(3).req相關的段

[ req ]
default_bits    = 2048     /* 生成證書請求時用到的私鑰的密鑰長度 */
default_md      = sha1     /* 證書請求籤名時的單向加密算法 */
default_keyfile = privkey.pem  /* 默認新建立的私鑰存放位置, */
                               /* 如-new選項沒指定-key時會自動建立私鑰 */
                               /* -newkey選項也會自動建立私鑰 */
distinguished_name  = req_distinguished_name /* 可識別的字段名(常被簡稱爲DN) */
                                             /* 引用req_distinguished_name段的設置 */
x509_extensions = v3_ca       /* 加入到自簽證書中的擴展項 */
# req_extensions = v3_req     /* 加入到證書請求中的擴展項 */
attributes  = req_attributes  /* 證書請求的屬性,引用req_attributes段的設置,能夠不設置它 */

# encrypt_key = yes | no /* 自動生成的私鑰文件要加密否?通常設置no,和-nodes選項等價 */
/* 輸入和輸出私鑰文件的密碼,若是該私鑰文件有密碼,不寫該設置則會提示輸入 */
/* input_password = secret */
/* output_password = secret */

# prompt = yes | no /* 設置爲no將不提示輸入DN field,而是直接從配置文件中讀取,須要同時設置DN默認值,不然建立證書請求時將出錯。 */
string_mask = utf8only

[ req_distinguished_name ]
/* 如下項都可指定可不指定,但ca段的policy中指定爲match和supplied必定要指定。 */
/* 如下選項均可以自定義,如countryName = C,commonName = CN */

countryName             = Country Name (2 letter code) /* 國家名(C) */
countryName_default     = XX /* 默認的國家名 */
countryName_min         = 2  /* 填寫的國家名的最小字符長度 */
countryName_max         = 2  /* 填寫的國家名的最大字符長度 */
stateOrProvinceName = State or Province Name (full name) /* 省份(S) */
/* stateOrProvinceName_default = Default Province */
localityName = Locality Name (eg, city) /* 城市(LT) */
localityName_default = Default City
0.organizationName  = Organization Name (eg, company) /* 公司(ON) */
0.organizationName_default  = Default Company Ltd
organizationalUnitName      = Organizational Unit Name (eg, section) /* 部門(OU) */
/* organizationalUnitName_default = */
/* 如下的commonName(CN)通常必須給,若是做爲CA,那麼須要在ca的policy中定義CN = supplied */
/* CN定義的是將要申請SSL證書的域名或子域名或主機名。 */
/* 例如要爲zhonghua.com申請ssl證書則填寫zhonghua.com,而不能填寫www.zhonghua.com */
/* 要爲www.zhonghua.com申請SSL則填寫www.zhonghua.com */
/* CN必須和將要訪問的網站地址同樣,不然訪問時就會給出警告 */
/* 該項要填寫正確,不然該請求被簽名後證書中的CN與實際環境中的CN不對應,將沒法提供證書服務 */
commonName  = Common Name (eg, your name or your server\'s hostname) /* 主機名(CN) */
commonName_max  = 64
emailAddress            = Email Address /* Email地址,不少時候不須要該項的 */
emailAddress_max        = 64

[ req_attributes ] /* 該段是爲了某些特定軟件的運行須要而設定的, */
                   /* 如今通常都不須要提供challengepassword */
                   /* 因此該段幾乎用不上 */
                   /* 因此不用管這段 */
challengePassword       = A challenge password
challengePassword_min   = 4
challengePassword_max   = 20
unstructuredName        = An optional company name
[ v3_req ]
/* Extensions to add to a certificate request */
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
[ v3_ca ]
/* Extensions for a typical CA */
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true
# keyUsage = cRLSign, keyCertSign  /* 典型的CA證書的使用方法設置,因爲測試使用因此註釋了 */
/* 若是真的須要申請爲CA/*麼該設置能夠如此配置 */

能夠自定義DN(Distinguished Name)段中的字段信息,注意ca段中的policy指定的匹配規則中若是指定了match或這supplied的則DN中必須定義。例以下面的示例:因爲只有countryName、organizationName和commonName被設定爲match和supplied,其他的都是optional,因此在DN中能夠只定義這3個字段,並且在DN中定義了自定義的名稱。

[policy_to_match]
countryName = match
stateOrProvinceName = optional
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[DN]
countryName = "C"
organizationName = "O"
commonName = "Root CA"

(4).配置文件示例

如下是一個配置文件的示例。假設該配置文件路徑爲/ssl/ssl.conf。

[default]
name = root-ca    /* 變量*/
default_ca = CA_default
name_opt = ca_default
cert_opt = ca_default

[CA_default]
home = .     /* 變量*/
database = $home/db/index
serial = $home/db/serial
crlnumber = $home/db/crlnumber
certificate = $home/$name.crt
private_key = $home/private/$name.key
RANDFILE = $home/private/random
new_certs_dir = $home/certs
unique_subject = no
copy_extensions = none
default_days = 3650
default_crl_days = 365
default_md = sha256
policy = policy_to_match

[policy_to_match]
countryName = match
stateOrProvinceName = optional
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

[CA_DN]
countryName = "C"
contryName_default = "CN"
organizationName = "O"
organizationName_default = "jmu"
commonName = "CN"
commonName_default = "longshuai.com"

[req]
default_bits = 4096
encrypt_key = no
default_md = sha256
utf8 = yes
string_mask = utf8only
# prompt = no  /* 測試時該選項致使出錯,因此將其註釋掉*/
distinguished_name = CA_DN
req_extensions = ca_ext

[ca_ext]
basicConstraints = critical,CA:true
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash

根據該配置文件示例,進行自建根CA、簽名等的操做方法請看:http://www.cnblogs.com/f-ck-need-u/p/6091105.html

相關文章
相關標籤/搜索