OpenSSL 操作筆記 - OpenSSL.cnf (req section)


功用

使用openssl ca,req,x509 指令時需要下很多參數,為了方便可以把一些值寫在 config file 裡, 另外還有一些比較複雜的內容
以及無法用指令修改的參數必須寫在 config file 裡

檔案路徑

若下指令時沒有指定路徑.openssl 會去抓環境變數OPENSSL_CONFSSLEAY_CONF,若沒有這些變數
就用 compile 時設定的路徑, 通常是 $OPENSSL_DIR/openssl.cnf
OPENSSL_DIR 可用 version 指令查詢
openssl version -d 
我手邊的電腦測出來結果是
Ubuntu: OPENSSLDIR: "/usr/lib/ssl"
CentOS: OPENSSLDIR: "/etc/pki/tls"
Windows:OPENSSLDIR: "/usr/local/ssl/openssl.cnf"

檔案格式

格式類似 inifile, 可以分成多個 sections, section 用單行的 [section_name] 來區別
註解的符號為#
section 裡的各項設定語法為 name=value
value 的值可以用變數表示,有以下幾種類別
  • 同 section
  • $var or ${var}
  • 不同 section
  • $section::name or ${section::name}
  • 環境變數
  • $ENV::name

範例檔案

會用到 ocnfig file 的指令主要有req, ca, x509
以下擷取部份 openssl 附的範例中與 req 相關的部份


# 最上層這些沒有 section name 的部份歸類在 [default] section

# This definition stops the following lines choking if HOME isn't
# defined.
# openssl 讀 config file 時如果遇到變數值是空的會跳 error
HOME   = .
RANDFILE  = $ENV::HOME/.rnd
#這邊規則還不太懂,好像是當 $ENV::HOME 抓不到值時會去抓 HOME
#################################################################### [ req ] # 這個 section 設定使用 req 指令的預設值, 可以在下指令實用參數複寫 default_bits = 2048 # 預設 private key長度, 對應的指令是 -newkey rsa:nbits default_keyfile = privkey.pem # 用 req 產生 private key 時的存檔路徑, 對應的指令是 -keyout distinguished_name = req_distinguished_name # distinguished_name 的值是 section name, 使用 req 產生 CSR 時會去這個 section 讀取 CSR subject 欄位的設定 # 這個值沒有對應的指令,但可以設成環境變數,使用 req 時再搭配 env 指令一起使用 #attributes = req_attributes # 這個東西我沒用過 x509_extensions = v3_ca # The extentions to add to the self signed cert # req 除了產生 CSR 以外,也有產生 self signed cert 的功能, 這個值也是一個 section name, section 內容為 certificate 的 extension 欄位 # 對應指令為 -extensions, 必須搭配 -x509 一起使用 # Passwords for private keys if not present they will be prompted for # 設定 private key 密碼, 對應指令為 -passin, -passout # input_password = secret # output_password = secret # 我覺的把 password 寫在 config file 有跟沒有一樣,不要加密以後使用還比較方便 # 不加密的話可以用以下設定, 對應的指令是 -nodes # encrypt_key = no # req_extensions = v3_req # The extensions to add to a certificate request # 設定 CSR 的 extensions 欄位, 對應的指令是 -reqexts, 這比較少用, # 因為用 ca sign CSR 基於安全行考量,時不一定會員全接受 CSR 的 extensions # 而用 x509 sign CSR 時則是直接丟掉 CSR 的 extensions # ca, x509 會依照自己的設定加入 extensions # This sets a mask for permitted string types. There are several options. # default: PrintableString, T61String, BMPString. # pkix : PrintableString, BMPString (PKIX recommendation before 2004) # utf8only: only UTF8Strings (PKIX recommendation after 2004). # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). # MASK:XXXX a literal mask value. # WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. string_mask = default # 這個設定 subject 欄位的值用什麼方式編碼, 若沒什麼特殊字元不需要改 # 這裡提供了幾種組合, 若需要其他組合可以用 MASK:XXXX 直接輸入數值 #根據 asn1.h 的定義去組合即可 #define B_ASN1_PRINTABLESTRING 0x0002 #define B_ASN1_T61STRING 0x0004 #define B_ASN1_BMPSTRING 0x0800 #define B_ASN1_UTF8STRING 0x2000 # 若沒加入 prompt, 或是 prompt != no, 製作 CSR 時會會要求使用者輸入 subject 欄位裡的值 # prompt=no [ req_distinguished_name ] # distinguished name 的格式有 2 種, # 第一種, 用於 prompt=no, 直接把值寫在 config file 裡, 這種方式適用於用其他程式執行 openssl 時先做好 config file,再直接執行 req 就好 # 這種格式很簡單, fieldName=value 即可, 例如 # C=TW # CN=My Name # OU=My Organization # emailAddress=someone@somewhere.org # 第二種, prompt != no, req 會跳出提示訊息指示使用者輸入, 格式為 # fieldName="prompt" # fieldName_default="default field value" # fieldName_min= 2 # fieldName_max= 4 # 一些常用的 fieldName 都已經包進 openssl 了, 可以打全名 (countryName) 或簡寫 (C), 還沒遇過要另外編輯 oid 的情形 # 採用第二種方式時,若製作 CSR 有些 field 有預設值但不想加入那個 field 時可以輸入 . # countryName = Country Name (2 letter code) countryName_default = AU countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Some-State localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company) 0.organizationName_default = Internet Widgits Pty Ltd # we can do this but it is not needed normally :-) #1.organizationName = Second Organization Name (eg, company) #1.organizationName_default = World Wide Web Pty Ltd organizationalUnitName = Organizational Unit Name (eg, section) #organizationalUnitName_default = commonName = Common Name (e.g. server FQDN or YOUR name) commonName_max = 64 emailAddress = Email Address emailAddress_max = 64 # 這個東西我沒用過 [ req_attributes ] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 unstructuredName = An optional company name # req_extensions 的範例 v3_req [ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment # x509_extensions 的範例, extension 可以設的東西很多,另外紀錄在... [ v3_ca ] subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer basicConstraints = CA:true

沒有留言:

張貼留言