本小抄風格的指南提供了 OpenSSL 命令的快速參考,這些命令在常見的日常場景中非常有用。
OpenSSL 是一個多功能的命令行工具,可以用于與 公鑰基礎設施(Public Key Infrastructure)(PKI)和 HTTPS(HTTP over TLS)相關的大量任務。這本小抄風格的指南提供了 OpenSSL 命令的快速參考,這些命令在常見的日常場景中非常有用。這包括生成私鑰、 證書簽署請求(certificate signing request)(CSR)和證書格式轉換的 OpenSSL 示例,但它并沒有涵蓋 OpenSSL 的所有用途。
如果你想從 證書頒發機構(certificate authority)(CA)那里獲得 SSL 證書,你必須生成一個 證書簽署請求(certificate signing request)(CSR)。一個 CSR 主要是由一個密鑰對的公鑰和一些附加信息組成。當證書被簽署時,這兩部分都會被插入到證書中。
每當你生成一個 CSR 時,你會被提示提供有關證書的信息。這些信息被稱為 區分名稱(Distinguised Name)(DN)。DN 中的一個重要字段是 通用名稱(Common Name)(CN),它應該是你打算使用證書的主機的 完全合格域名(Fully Qualified Domain Name)(FQDN)。當創建 CSR 時,也可以通過命令行或文件傳遞信息來跳過交互式提示。
DN 中的其他項目提供了有關你的業務或組織的附加信息。如果你是從證書機構購買 SSL 證書,通常要求這些附加字段(如“ 組織(Organization)”)準確地反映你的組織的詳細信息。
下面是一個 CSR 信息提示的例子:
---
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:
如果你想非交互式地回答 CSR 信息提示,你可以通過在任何請求 CSR 信息的 OpenSSL 命令中添加 -subj 選項來實現。這里是該選項的一個例子,使用上面代碼塊中顯示的相同信息:
-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"
現在你已經了解了 CSR,可以自由跳轉到本指南中涵蓋你的 OpenSSL 需求的任何一節。
本節介紹了與生成 CSR(以及私鑰,如果它們還不存在的話)有關的 OpenSSL 命令。CSR 可以用來向證書頒發機構請求 SSL 證書。
請記住,你可以通過上一節中提到的 -subj 選項非交互式地添加 CSR 信息。
生成一個私鑰和一個 CSR
如果你想使用 HTTPS(HTTP over TLS)來保護你的 Apache HTTP 或 Nginx Web 服務器的安全,并且你想使用一個證書頒發機構(CA)來頒發 SSL 證書,那么就使用這個方法。生成的 CSR 可以發送給 CA,請求簽發由 CA 簽名的 SSL 證書。如果你的 CA 支持 SHA-2,請添加 -sha256 選項,用 SHA-2 簽署 CSR。
這條命令從頭開始創建一個 2048 位的私鑰(domain.key)和一個 CSR(domain.csr):
openssl req \
-newkey rsa:2048 -nodes -keyout domain.key \
-out domain.csr
回答 CSR 信息提問,完成該過程。
選項 -newkey rsa:2048 指定密鑰應該是 2048 位,使用 RSA 算法生成。選項 -nodes 指定私鑰沒有用密碼加密。這里沒有包含 -new 選項,而是隱含在其中,表示正在生成一個 CSR。
從現有的私鑰中生成一個 CSR
如果你已經有了私鑰,并想用它向 CA 申請證書,請使用這個方法。
該命令基于現有的私鑰(domain.key)創建一個新的 CSR(domain.csr):
openssl req \
-key domain.key \
-new -out domain.csr
回答 CSR 信息提問,完成該過程。
選項 -key 指定一個現有的私鑰(domain.key),它將被用來生成一個新的 CSR。選項 -new 表示正在生成一個 CSR。
從現有的證書和私鑰生成 CSR
如果你想更新現有的證書,但由于某些原因,你或你的 CA 沒有原始的 CSR,請使用這個方法。基本上可以省去重新輸入 CSR 信息的麻煩,因為它是從現有證書中提取信息的。
該命令基于現有的證書(domain.crt)和私鑰(domain.key)創建一個新的 CSR(domain.csr):
openssl x509 \
-in domain.crt \
-signkey domain.key \
-x509toreq -out domain.csr
選項 -x509toreq 指定你使用一個 X509 證書來制作 CSR。
如果你想使用 SSL 證書來確保服務的安全,但你不需要 CA 簽名的證書,一個有效的(和免費的)解決方案是簽署你自己的證書。
你可以自己簽發的一種常見證書是 自簽證書(self-signed certificate)。自簽證書是用自己的私鑰簽署的證書。自簽證書和 CA 簽名證書一樣可以用來加密數據,但是你的用戶會顯示一個警告,說這個證書不被他們的計算機或瀏覽器信任。因此,只有當你不需要向用戶證明你的服務身份時,才可以使用自簽名證書(例如非生產或非公開服務器)。
本節介紹與生成自簽名證書相關的 OpenSSL 命令。
生成自簽證書
如果你想使用 HTTPS(HTTP over TLS)來保護你的 Apache HTTP 或 Nginx Web 服務器,并且你不需要你的證書由 CA 簽名,那么就使用這個方法。
這個命令可以從頭開始創建一個 2048 位的私鑰(domain.key)和一個自簽證書(domain.crt):
openssl req \
-newkey rsa:2048 -nodes -keyout domain.key \
-x509 -days 365 -out domain.crt
回答 CSR 信息提問,完成該過程。
選項 -x509 告訴 req 子命令創建一個自簽名的證書。-days 365 選項指定證書的有效期為 365 天。它會生成一個臨時的 CSR,以收集與證書相關的信息。
從現有私鑰生成自簽名證書
如果你已經有了一個私鑰,并且你想用它來生成一個自簽證書,請使用這個方法。
這條命令可以從現有的私鑰(domain.key)中創建一個自簽證書(domain.crt):
openssl req \
-key domain.key \
-new \
-x509 -days 365 -out domain.crt
回答 CSR 信息提問,完成該過程。
選項 -x509 告訴 req 子命令創建一個自簽證書。-days 365 選項指定證書的有效期為 365 天。選項 -new 啟用 CSR 信息提問。
從現有的私鑰和 CSR 生成自簽證書
如果你已經有了私鑰和 CSR,并且你想用它們生成一個自簽證書,請使用這個方法。
這條命令將從現有的私鑰(domain.key)和(domain.csr)中創建一個自簽證書(domain.crt)。
openssl x509 \
-signkey domain.key \
-in domain.csr \
-req -days 365 -out domain.crt
選項 -days 365 指定證書的有效期為 365 天。
證書和 CSR 文件是以 PEM 格式編碼的,不適合被人讀取。
本節介紹的 OpenSSL 命令將輸出 PEM 編碼文件的實際條目。
查看 CSR 條目
該命令允許你查看和驗證純文本的 CSR(domain.csr)的內容:
openssl req \
-text -noout -verify \
-in domain.csr
查看證書條目
該命令允許你查看純文本證書(domain.crt)的內容:
openssl x509 \
-text -noout \
-in domain.crt
驗證證書由 CA 簽署
使用此命令驗證證書(domain.crt)是否由特定的 CA 證書(ca.crt)簽署:
openssl verify \
-verbose -CAFile ca.crt \
domain.crt
本節介紹了用于創建和驗證私鑰的 OpenSSL 命令。
創建私鑰
使用該命令創建一個受密碼保護的 2048 位私鑰(domain.key):
openssl genrsa \
-des3 -out domain.key 2048
在提示時輸入密碼以完成該過程。
驗證私鑰
使用此命令檢查私鑰(domain.key)是否為有效密鑰:
openssl rsa \
-check -in domain.key
如果你的私鑰已經加密,系統會提示你輸入它的密碼,成功后,未加密的密鑰會在終端上輸出。
驗證私鑰是否與證書和 CSR 匹配
使用這些命令來驗證私鑰(domain.key)是否匹配證書(domain.crt)和 CSR(domain.csr):
openssl rsa -noout -modulus -in domain.key | openssl md5
openssl x509 -noout -modulus -in domain.crt | openssl md5
openssl req -noout -modulus -in domain.csr | openssl md5
如果每條命令的輸出都是相同的,那么私鑰、證書和 CSR 就極有可能是相關的。
加密私鑰
這需要一個未加密的私鑰(unencrypted.key),并輸出它的加密版本(encrypted.key):
openssl rsa -des3 \
-in unencrypted.key \
-out encrypted.key
輸入你所需的密碼,以加密私鑰。
解密私鑰
這需要一個加密的私鑰(encrypted.key),并輸出一個解密的版本(decrypted.key):
openssl rsa \
-in encrypted.key \
-out decrypted.key
在提示時,輸入加密密鑰的密碼。
我們一直在使用的所有證書都是 ASCII 碼 PEM 編碼的 X.509 證書。還有很多其他的證書編碼和容器類型;一些應用程序喜歡某些格式而不是其他格式。此外,這些格式中的許多格式可以在一個文件中包含多個項目,如私鑰、證書和 CA 證書。
OpenSSL 可以用來將證書在則西格式間轉換。本節將介紹一些可能的轉換。
將 PEM 轉換為 DER
如果要將 PEM 編碼的證書(domain.crt)轉換為 DER 編碼的證書(domain.der),即二進制格式,請使用此命令:
openssl x509 \
-in domain.crt \
-outform der -out domain.der
DER 格式通常與 Java 一起使用。
將 DER 轉換為 PEM
如果要將 DER 編碼的證書(domain.der)轉換為 PEM 編碼的證書(domain.crt),請使用此命令:
openssl x509 \
-inform der -in domain.der \
-out domain.crt
將 PEM 轉換為 PKCS7
如果你想把 PEM 證書(domain.crt 和 ca-chain.crt)添加到 PKCS7 文件(domain.p7b)中,請使用該命令:
openssl crl2pkcs7 -nocrl \
-certfile domain.crt \
-certfile ca-chain.crt \
-out domain.p7b
請注意,你可以使用一個或多個 -certfile 選項來指定要添加到 PKCS7 文件中的證書。
PKCS7 文件,也被稱為 P7B,通常用于 Java Keystores 和 Microsoft IIS(Windows)。它們是 ASCII 文件,可以包含證書和 CA 證書。
將 PKCS7 轉換為 PEM
如果你想將 PKCS7 文件(domain.p7b)轉換為 PEM 文件,請使用該命令:
openssl pkcs7 \
-in domain.p7b \
-print_certs -out domain.crt
請注意,如果你的 PKCS7 文件中有多個項目(如證書和 CA 中間證書),創建的 PEM 文件將包含其中的所有項目。
將 PEM 轉換為 PKCS12
如果你想使用私鑰(domain.key)和證書(domain.crt),并將它們組合成一個 PKCS12 文件(domain.pfx),請使用這個命令:
openssl pkcs12 \
-inkey domain.key \
-in domain.crt \
-export -out domain.pfx
系統會提示你輸入導出密碼,你可以留空。請注意,在這種情況下,你可以通過將多個證書連接到一個 PEM 文件(domain.crt)中來添加一個證書鏈到 PKCS12 文件中。
PKCS12 文件,也被稱為 PFX 文件,通常用于在 Micrsoft IIS(Windows)中導入和導出證書鏈。
將 PKCS12 轉換為 PEM
如果你想轉換 PKCS12 文件(domain.pfx)并將其轉換為 PEM 格式(domain.combined.crt),請使用此命令:
openssl pkcs12 \
-in domain.pfx \
-nodes -out domain.combined.crt
請注意,如果你的 PKCS12 文件中有多個項目(如證書和私鑰),創建的 PEM 文件將包含其中的所有項目。
openssl version 命令可以用來檢查你正在運行的版本。你正在運行的 OpenSSL 版本,以及編譯時使用的選項會影響到你可以使用的功能(有時也會影響到命令行選項)。
下面的命令顯示了你正在運行的 OpenSSL 版本,以及它被編譯時的所有選項:
openssl version -a
本指南是使用具有如下細節的 OpenSSL 二進制文件編寫的(參見前面命令的輸出):
OpenSSL 1.0.1f 6 Jan 2014
built on: Mon Apr 7 21:22:23 UTC 2014
platform: debian-amd64
options: bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: cc -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/usr/lib/ssl"
這應該涵蓋了大多數人如何使用 OpenSSL 來處理 SSL 證書的情況!它還有很多其他的用途,在這里沒有介紹,所以請在評論中隨時詢問或建議其他用途。
如果你在使用這些命令時遇到了問題,請一定要評論(并附上你的 OpenSSL 版本輸出)。
via: https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs
作者: Mitchell Anicas 選題: wxy 譯者: wxy 校對: wxy
本文由 LCTT 原創編譯, Linux中國 榮譽推出
單屬性匯總:
1 name屬性
服務器會識別不同的name屬性,并根據name屬性來捕獲不同元素內的數據。
2 value屬性
value 屬性為 input 元素設定值。
對于不同的輸入類型,value 屬性的用法也不同:
type="button", "reset", "submit" - 定義按鈕上的顯示的文本
type="text", "password", "hidden" - 定義輸入字段的初始值
type="checkbox", "radio", "image" - 定義與輸入相關聯的值
注釋:<input type="checkbox"> 和 <input type="radio"> 中必須設置 value 屬性。
注釋:value 屬性無法與 <input type="file"> 一同使用。
注意:單選框和復選框傳遞數據到數據庫時一定要設置value, 否則插入數據失敗;
3 type屬性
它決定了<input>標簽在頁面中的表現樣式和功能
text 文本框
password 密碼框
radio 單選框
checkbox 復選框
file 文件域
hidden 隱藏域
image 圖像域
submit 提交按鈕
reset 重置按鈕
button 普通按鈕
4 size屬性
列表框中size屬性用來設置列表框顯示的行數;
文本框和密碼框會使用size屬性設置域的顯示寬度;
5 disabled屬性
定義disabled屬性可以禁止使用該元素;
無法將數據提交到服務器處理;
6 readonly屬性
常用在輸入性表單對象中(如文本框、密碼框、文本區域),用來禁止輸入任何信息;
可以將數據提交到服務器處理;
7 checked屬性
它與disabled屬性一樣沒有屬性值,常用在選擇性表單對象中,定義對象處于被選中狀態(如單選按鈕和復選框)
但在列表框或者下拉式菜單中,為了表示被選中的項目,可使用selected屬性;
7 placeholder屬性
規定幫助用戶填寫輸入字段的提示。
表單對象:
1 文本框
<input type="text" name="textfield" id="textfield" value="單行文本框" size="20" maxlength="20">
必需的屬性:name type
2 密碼域
<input type="password" name="passwordfield" id="passwordfield">
必需的屬性:name type
3 文本域
<textarea name="textarea" cols="20" rows="5" wrap="physical"></textarea>
必需的屬性:name cols rows
wrap屬性 默認值:輸入的文本會自動換行。當數據提交到服務器被處理時, 換行符不會隨輸入的文本一同被提交到服務器;
off(也可寫成wrap):不自動換行, 當輸入的內容超出文本區域右邊界時, 文本將向左滾動, 并顯示滾動條。
如果希望換行,必須手動輸入回車鍵才能將插入點移到下一行;
virtual:文本能夠自動換行, 當數據提交到服務器被處理時, 換行符不會隨輸入文本一同提交到服務器;(默認值)
physical:文本能夠自動換行, 當數據提交到服務器被處理時, 換行符將會隨輸入的文本一同被提交到服務器進行處理;
關于如何限制文本域輸入字符串的長度 見javascript|語法|設置文本框
HTML5中wrap中屬性值修改為hard|soft
soft 當在表單中提交時, textarea 中的文本不換行, 默認值。
hard 當在表單中提交時, textarea 中的文本換行(包含換行符)。
當使用 "hard" 時, 必須規定 cols 屬性
4 單選按鈕
單選按鈕傳遞的信息簡單,如1或0、True或False。
<input type="radio" name="radio" value="1"/>選項1
<input type="radio" name="radio" value="2"/>選項2
<input type="radio" name="radio" value="3"/>選項3
多個單選按鈕通過定義相同的name屬性, 以實現捆綁在一起;
必需的屬性:type name value
5 復選框
<input type="checkbox" name="checkbox[]" value="1"/>選項2
<input type="checkbox" name="checkbox[]" value="2"/>選項2
<input type="checkbox" name="checkbox[]" value="3"/>選項2
通過設置相同的name屬性可以把多個復選框捆綁在一起;
必需的屬性:type name value
6 列表框/下拉菜單
<select name="select" size=1>
<option value="1">1</option>
<option value="2" selected="selected">2</option>
<option value="3">3</option>
</select>
如果select元素中不設置size屬性,則該元素會顯示為下拉菜單樣式
<select name="select" size="1" multiple="multiple">
<option value="1">1</option>
<option value="2" selected="selected">2</option>
<option value="3">3</option>
</select>
如果希望以列表框形式顯示,則可以使用size屬性指定列表框的高度(顯示幾個選項);
還可以通過mutiple屬性定義列表框是否為多選(默認是單選);
通過<optgroup>標簽把相關的選項組合在一起:
<select>
<optgroup label="PHP版塊">
<option value="resource">資源共享</option>
<option value="study">學習交流</option>
<option value="salary">薪酬待遇</option>
</optgroup>
<optgroup label="IOS版塊">
<option value="resource">資源共享</option>
<option value="study">學習交流</option>
<option value="salary">薪酬待遇</option>
</optgroup>
</select>
注意:其中PHP版塊和IOS版塊不能被選中
所有主流瀏覽器都支持 <optgroup> 標簽。
7 文件域
<input type="file" name="file"/>
<input type="file" name="file" multiple/>
8 按鈕
提交按鈕
<input type="submit" name="" value="提交"/>
name值必須給出
重置按鈕
<input type="reset" name="" value="重置"/>
普通按鈕
<input type="button" name="" value="普通按鈕"/>
它一般是配合javascript來使用;
關于控制表單提交按鈕見: javascript|語法|控制表單提交
9 圖像域
<input type="image" name="image" value="提交" src="images/vote_d.gif" alt="提交" align="middle"/>
10 隱藏域
限制上傳文件大小
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
傳遞ID值
<input type="hidden" name="id" value="<?php echo $result['id'];?>" />
11 button標簽
在 button 元素內部,您可以放置內容,比如文本或圖像。這是該元素與使用 input 元素創建的按鈕之間的不同之處。
<button type="button" name="button" value="按鈕"><img src="hw001.jpeg"/></button>
普通按鈕<button type="button">普通按鈕</button> 它一般是配合javascript來使用, 默認值
提交按鈕<button type="submit">提交按鈕</button>
重置按鈕<button type="reset">重置按鈕</button>
提交表單
enctype屬性
該屬性包含兩種方式:
application/x-www-form-urlencoded 是默認編碼類型
multipart/form-data
multipart/form-data編碼方式可以用來傳輸二進制數據或者非ASCII字符的文本(如圖片、不同格式的文件等),上傳文件必須使用此屬性
multipart: 多部件的
multiple: 多重的
text/plain
text/plain將表單屬性發送到電子郵箱時,enctype的值必須設為"text/plain",否則將會出現亂碼。
發送電子郵件的表單程序
<form name="form1" method="post" action="mailto:marker@broadview.com.cn" enctype="text/plain">
</form>
action 表單提交的腳本
如果傳遞到本頁面,則直接輸入控制 action=""
表單提交方式method:post/get
<form action="test.php?id=5" method="post" >
name: <input type="text" name="name" value="100">
</form>
id=5是get傳, name="100" 是post傳! //高洛峰解釋
action="" 表示傳遞到當前腳本文件
target 指定提交到哪一個窗口
_blank 打開新窗口
_self 當前的窗口,默認值
_parent 上一層窗口
_top 最上層窗口
框架名稱 指定指定窗口或框架名稱
label標簽
作用: 擴大觸控區域, 為了提升用戶體驗, 點擊文字也能選中表單
<form action=" method="get" accept-charset="utf-8">
<label>電子郵箱: <input type="text" name="email" value="" placeholder="請輸入電子郵箱"/></label><br/>
<label>密碼: <input type="password" name="password"/></label><br/>
<label for="address">地址</label>
<input type="text" name="address" id="address" placeholder="請輸入地址" />
</form>
for與id一致
<input type="radio" id="sec" name="sex"> <label for="sex">男</label>
簡化寫法:
<label><input type="checkbox"/>周杰倫-晴天</label>
注意: "for" 屬性可把 label 綁定到另外一個元素。請把"for"屬性的值設置為相關元素的 id 屬性的值。
PHP實例:創建發送郵件信息的html表單
代碼:
<html>
<head>
<title>簡單郵件發送表單</title>
</head>
<body>
<h1>Mail Form</h1>
<form name="form1" method="post" action="simpleEmail.php">
<table>
<tr><td><b>To</b></td><td><input type="text" name="mailto" size="35"></td></tr>
<tr><td><b>郵件主題:</b></td>
<td><input type="text" name="mailsubject" size="35"></td></tr>
<tr><td><b>郵件內容</b></td>
<td><textarea name="mailbody" cols="50" rows="7"></textarea></td>
</tr>
<tr><td colspan="2">
<input type="submit" name="Submit" value="發送">
</td>
</tr>
</table>
</form>
</body>
</html>
simpleEmail.php
1、表單:就是從網頁上看見的各種各樣的框,比如 登陸框、同意協議的選項框、下拉框、只能選男女的選框等。
代碼需要復制到編譯器里面看,效果會好些
代碼實例:所有的框、按鈕,都在下面的代碼中,并且有注釋,照著寫就好
注意事項:單標簽的內容是單標簽的屬性(也就是在標簽中加入 value 屬性);雙標簽的內容在兩個標簽之間。
注意事項:
1、表單元素中,用戶可以輸入值的時候,可以不加value屬性 -- (比如:文本框、文本域)。
2、當表單元素中沒有值的時候,需要加value屬性 -- (比如:單選框、復選框)。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。