openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
雖說配置文件很多設置不用修改就能直接使用,但是了解它是配置openssl相關事項所必須的。而且要實現復雜多功能,必然要對配置相關了然於心。
1.man config
該幫助文檔說明了openssl.cnf以及一些其他輔助配置文件的規范、格式及讀取方式。后文中的所有解釋除非特別指明,都將以openssl.cnf為例。
[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可以包含字母、數字和下划線。
第一個section被解釋為默認段落,默認段落一般(是一般不是一定)沒有[section_name]標識。當搜索某一個section時,將首先搜索有名稱的section,然后還會搜索默認section,如果沒有找到匹配的有名稱的section,將直接讀取默認section。
該配置文件中使用#開頭來書寫注釋信息。每個section包含一些name以及它們的值,格式為name=value,name和value的前導或尾隨空格被忽略,如果要包含空格應該使用引號包圍。
在name部分可以包含字母、數字以及一些標點符號,如“.”“,”“;”或“_”。
在value部分可以使用變量擴展。在每個section中可以定義變量,每個section的變量默認只作用於當前section,變量引用的格式有兩種"$var"或"${var}"。如果想要引用其他section中的變量或name,可以使用"$section_name::name"或"${section::name}"。
在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
