openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.htmlhtml
雖然說配置文件不少設置不用修改就能直接使用,可是瞭解它是配置openssl相關事項所必須的。並且要實現複雜多功能,必然要對配置相關了然於心。node
該幫助文檔說明了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
該文件主要設置了證書請求、簽名、crl相關的配置。主要相關的僞命令爲ca和req。對於x509不用該配置文件。
該文件從功能結構上分爲4個段落:默認段、ca相關的段、req相關的段、tsa相關的段。每一個段中都以name=value的格式定義。
該文件中沒有被引用的段被視爲忽略段,不會起到任何做用。
每一個段中能夠書寫哪些name以及它們的意義,能夠man相關命令,如man ca能夠查看ca相關段能夠書寫的name,man req能夠查看req相關段能夠書寫的name。
第一段是默認段,通常沒有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
這些段定義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
[ 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"
如下是一個配置文件的示例。假設該配置文件路徑爲/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