




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
PAGE5openssl簡介(中文版本)目錄TOC\o"1-3"\h\z前言 1openssl簡介-證書 2openssl簡介-加密算法 8openssl簡介-協議 10openssl簡介-入門 12openssl簡介-指令verify 14openssl簡介-指令asn1parse 18openssl簡介-指令ca(一) 20openssl簡介-指令ca(二) 24openssl簡介-指令cipher 26openssl簡介-指令dgst 31openssl簡介-指令dhparam 32openssl簡介-指令enc 34openssl簡介-指令gendsa 39openssl簡介-指令genrsa 40openssl簡介-指令passwd 41openssl簡介-指令pkcs7 42openssl簡介-指令rand 43openssl簡介-指令req(一) 44openssl簡介-指令req(二) 47openssl簡介-指令rsa 50openssl簡介-指令rsautl 52openssl簡介-指令s_client(一) 56openssl簡介-指令s_client(二) 59openssl簡介-指令s_server 63openssl簡介-指令sess_id 66openssl簡介-指令speed 68openssl簡介-指令version 69openssl簡介-指令x509(一) 70openssl簡介-指令x509(二) 74前言不久前接到有關ssl的活,結果找遍中文網站資料實在奇缺。感覺是好象現在國內做這個技術的人不多。所有有興趣寫點東西來介紹一下。
我使用的ssl的toolkit是openssl就用openssl做例子來講解
openssl實在太大了,指令也多,API也多,更嚴重的是它的API沒有說明。我打算漫漫說清楚其主要指令的用法,主要API的中文說明,以及使用/編程的方法。
工作量很大,因為我接觸它也沒幾個月,現在大概完成了1/10吧,先把目前自己的一些心得,找到的資料和一些翻譯出來的東西貼出來,希望對研究ssl的人有幫助
文章里的bug歡迎告之openssl簡介-證書證書就是數字化的文件,里面有一個實體(網站,個人等)的公共密鑰和其他的屬性,如名稱等。該公共密鑰只屬于某一個特定的實體,它的作用是防止一個實體假裝成另外一個實體。
證書用來保證不對稱加密算法的合理性。想想吧,如果沒有證書記錄,那么假設某倆人A與B的通話過程如下:
這里假設A的publickey是K1,privatekey是K2
B的publickey是K3,privatekey是K4
xxxxxx(kn)表示用kn加密過的一段文字xxxxxx
A〉hello(plaintext)〉B
A〈hello(plaintext)〈B
A〈Bspublickey〈B
A〉spublickey(K1)〉B
......
如果C想假裝成B,那么步驟就和上面一樣。
A〉hello(plaintext)〉C
A〈hello(plaintext)〈C
注意下一步,因為A沒有懷疑C的身份,所以他理所當然的接受了C的
publickey,并且使用這個key來繼續下面的通信。
A〈Cspublickey〈C
A〉Aspublickey(K1)〉C
......
這樣的情況下A是沒有辦法發覺C是假的。如果A在通話過程中要求取得B的證書,并且驗證證書里面記錄的名字,如果名字和B的名字不符合,就可以發現對方不是B.驗證B的名字通過再從證書里面提取B的公用密鑰,繼續通信過程。
那么,如果證書是假的怎么辦?或者證書被修改過了怎么辦?慢慢看下來吧。
證書最簡單的形式就是只包含有證書擁有者的名字和公用密鑰。當然現在用的證書沒這么簡單,里面至少還有證書過期的deadline,頒發證書的機構名稱,證書系列號,和一些其他可選的信息。最重要的是,它包含了證書頒發機構(certificationauthorit簡稱CA)的簽名信息。
我們現在常用的證書是采用X.509結構的,這是一個國際標準證書結構。任何遵循該標準的應用程序都可以讀寫X509結構的證書。
通過檢查證書里面的CA的名字,和CA的簽名,就知道這個證書的確是由該CA簽發的,然后,你就可以簡單證書里面的接收證書者的名字,然后提取公共密鑰。這樣做建立的基礎是,你信任該CA,認為該CA沒有頒發錯誤的證書。
CA是第三方機構,被你信任,由它保證證書的確發給了應該得到該證書的人。CA自己有一個龐大的publickey數據庫,用來頒發給不同的實體。
這里有必要解釋一下,CA也是一個實體,它也有自己的公共密鑰和私有密鑰,否則怎么做數字簽名?它也有自己的證書,你可以去它的站點down它的證書得到它的公共密鑰。
一般CA的證書都內嵌在應用程序中間。不信你打開你的IE,在internet選項里面選中"內容",點擊"證書",看看那個"中間證書發行機構"和"委托根目錄發行機構",是不是有一大堆CA的名稱?也有時CA的證書放在安全的數據庫里面。
當你接受到對方的證書的時候,你首先會去看該證書的CA,然后去查找自己的CA證書數據庫,看看是否找的到,找不到就表示自己不信任該CA,那么就告吹本次連接。找到了的話就用該CA的證書里面的公用密鑰去檢查CA在證書上的簽名。
這里又有個連環的問題,我怎么知道那個CA的證書是屬于那個CA的?人家不能造假嗎?
解釋一下吧。CA也是分級別的。最高級別的CA叫RootCAs,其他cheap一點的CA的證書由他們來頒發和簽名。這樣的話,最后的保證就是:我們信任RootCAs.那些有RootCAs簽名過的證書的CA就可以來頒發證書給實體或者其他CA了。
你不信任RootCAs?人民幣由中國人民銀行發行,運到各個大銀行,再運到地方銀行,你從地方銀行取人民幣的時候不信任發行它的中國人民銀行嗎?RootCAs都是很權威的機構,沒有必要擔心他們的信用。
那RootCAs誰給簽名?他們自己給自己簽名,叫自簽名.
說了這么多,舉個證書的例子吧,對一些必要的子項解釋一下。
CertificateExample
Certificate:
Data:
Version:1(0x0)
SerialNumber://系列號
02:41:00:00:16
SignatureAlgorithm:md2WithRSAEncryption//CA同志的數字簽名的算法
Issuer:C=US,O=RSADataSecurity,Inc.,OU=Commercial//CA自報家門
Certification
Authority
Validity
NotBefore:Nov418:58:341994GMT//證書的有效期
NotAfter:Nov318:58:341999GMT
Subject:C=US,O=RSADataSecurity,Inc.,OU=Commercial
CertificationAuthority
SubjectPublicKeyInfo:
PublicKeyAlgorithm:rsaEncryption
RSAPublicKey:(1000bit)
Modulus(1000bit):
00:a4:fb:81:62:7b:ce:10:27:dd:e8:f7:be:6c:6e:
c6:70:99:db:b8:d5:05:03:69:28:82:9c:72:7f:96:
3f:8e:ec:ac:29:92:3f:8a:14:f8:42:76:be:bd:5d:
03:b9:90:d4:d0:bc:06:b2:51:33:5f:c4:c2:bf:b6:
8b:8f:99:b6:62:22:60:dd:db:df:20:82:b4:ca:a2:
2f:2d:50:ed:94:32:de:e0:55:8d:d4:68:e2:e0:4c:
d2:cd:05:16:2e:95:66:5c:61:52:38:1e:51:a8:82:
a1:c4:ef:25:e9:0a:e6:8b:2b:8e:31:66:d9:f8:d9:
fd:bd:3b:69:d9:eb
Exponent:65537(0x10001)
SignatureAlgorithm:md2WithRSAEncryption
76:b5:b6:10:fe:23:f7:f7:59:62:4b:b0:5f:9c:c1:68:bc:49:
bb:b3:49:6f:21:47:5d:2b:9d:54:c4:00:28:3f:98:b9:f2:8a:
83:9b:60:7f:eb:50:c7:ab:05:10:2d:3d:ed:38:02:c1:a5:48:
d2:fe:65:a0:c0:bc:ea:a6:23:16:66:6c:1b:24:a9:f3:ec:79:
35:18:4f:26:c8:e3:af:50:4a:c7:a7:31:6b:d0:7c:18:9d:50:
bf:a9:26:fa:26:2b:46:9c:14:a9:bb:5b:30:98:42:28:b5:4b:
53:bb:43:09:92:40:ba:a8:aa:5a:a4:c6:b6:8b:57:4d:c5
其實這是我們看的懂的格式的證書內容,真正的證書都是加密過了的,其丑惡面容如下:
BEGINCERTIFICATE
MIIDcTCCAtqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBiDELMAkGA1UEBhMCQ0gx
EjAQBgNVBAgTCWd1YW5nZG9uZzESMBAGA1UEBxMJZ3Vhbmd6aG91MREwDwYDVQQK
Ewhhc2lhaW5mbzELMAkGA1UECxMCc3cxDjAMBgNVBAMTBWhlbnJ5MSEwHwYJKoZI
hvcNAQkBFhJmb3JkZXNpZ25AMjFjbi5jb20wHhcNMDAwODMwMDc0MTU1WhcNMDEw
ODMwMDc0MTU1WjCBiDELMAkGA1UEBhMCQ0gxEjAQBgNVBAgTCWd1YW5nZG9uZzES
MBAGA1UEBxMJZ3Vhbmd6aG91MREwDwYDVQQKEwhhc2lhaW5mbzELMAkGA1UECxMC
c3cxDjAMBgNVBAMTBWhlbnJ5MSEwHwYJKoZIhvcNAQkBFhJmb3JkZXNpZ25AMjFj
bi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMDYArTAhLIFacYZwP30
Zu63mAkgpAjVHaIsIEJ6wySIZl2THEHjJ0kS3i8lyMqcl7dUFcAXlLYi2+rdktoG
jBQMOtOHv1/cmo0vzuf38+NrAZSZT9ZweJfIlp8W9uyz8Dv5hekQgXFg/l3L+HSx
wNvQalaOEw2nyf45/np/QhNpAgMBAAGjgegwgeUwHQYDVR0OBBYEFKBL7xGeHQSm
ICH5wBrOiqNFiildMIG1BgNVHSMEga0wgaqAFKBL7xGeHQSmICH5wBrOiqNFiild
oYGOpIGLMIGIMQswCQYDVQQGEwJDSDESMBAGA1UECBMJZ3Vhbmdkb25nMRIwEAYD
VQQHEwlndWFuZ3pob3UxETAPBgNVBAoTCGFzaWFpbmZvMQswCQYDVQQLEwJzdzEO
MAwGA1UEAxMFaGVucnkxITAfBgkqhkiG9w0BCQEWEmZvcmRlc2lnbkAyMWNuLmNv
bYIBADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GBAGQa9HK2mixM7ML7
0jZr1QJUHrBoabX2AbDchb4Lt3qAgPOktTc3F+K7NgB3WSVbdqC9r3YpS23RexU1
aFcHihDn73s+PfhVjpT8arC1RQDg9bDPvUUYphdQC0U+HF72/CvxGCTqpnWiqsgw
xqeog0A8H3doDrffw8Zb7408+Iqf
ENDCERTIFICATE
證書都是有壽命的。就是上面的那個NotBefore和NotAfter之間的日子。過期的證書,如果沒有特殊原因,都要擺在證書回收列(certificaterevocationlist)里面.證書回收列,英文縮寫是CRL.比如一個證書的key已經被破了,或者證書擁有者沒有權力再使用該證書,該證書就要考慮作廢。CRL詳細記錄了所有作廢的證書。
CRL的缺省格式是PEM格式。當然也可以輸出成我們可以讀的文本格式。下面有個CRL的例子。
BEGINX509CRL
MIICjTCCAfowDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMxIDAeBgNVBAoT
F1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2VydmVy
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Fw05NTA1MDIwMjEyMjZaFw05NTA2MDEw
MDAxNDlaMIIBaDAWAgUCQQAABBcNOTUwMjAxMTcyNDI2WjAWAgUCQQAACRcNOTUw
MjEwMDIxNjM5WjAWAgUCQQAADxcNOTUwMjI0MDAxMjQ5WjAWAgUCQQAADBcNOTUw
MjI1MDA0NjQ0WjAWAgUCQQAAGxcNOTUwMzEzMTg0MDQ5WjAWAgUCQQAAFhcNOTUw
MzE1MTkxNjU0WjAWAgUCQQAAGhcNOTUwMzE1MTk0MDQxWjAWAgUCQQAAHxcNOTUw
MzI0MTk0NDMzWjAWAgUCcgAABRcNOTUwMzI5MjAwNzExWjAWAgUCcgAAERcNOTUw
MzMwMDIzNDI2WjAWAgUCQQAAIBcNOTUwNDA3MDExMzIxWjAWAgUCcgAAHhcNOTUw
NDA4MDAwMjU5WjAWAgUCcgAAQRcNOTUwNDI4MTcxNzI0WjAWAgUCcgAAOBcNOTUw
NDI4MTcyNzIxWjAWAgUCcgAATBcNOTUwNTAyMDIxMjI2WjANBgkqhkiG9w0BAQIF
AAN+AHqOEJXSDejYy0UwxxrH/9+N2z5xu/if0J6qQmK92W0hW158wpJg+ovV3+wQ
wvIEPRL2rocL0tKfAsVq1IawSJzSNgxG0lrcla3MrJBnZ4GaZDu4FutZh72MR3Gt
JaAL3iTJHJD55kK2D/VoyY1djlsPuNh6AEgdVwFAyp0v
ENDX509CRL
下面是文本格式的CRL的例子。
ThefollowingisanexampleofaCRLintextformat:
issuer=/C=US/O=RSADataSecurity,Inc./OU=SecureServerCertification
Authority
lastUpdate=May202:12:261995GMT
nextUpdate=Jun100:01:491995GMT
revoked:serialNumber=027200004CrevocationDate=May202:12:261995GMT
revoked:serialNumber=0272000038revocationDate=Apr2817:27:211995GMT
revoked:serialNumber=0272000041revocationDate=Apr2817:17:241995GMT
revoked:serialNumber=027200001ErevocationDate=Apr800:02:591995GMT
revoked:serialNumber=0241000020revocationDate=Apr701:13:211995GMT
revoked:serialNumber=0272000011revocationDate=Mar3002:34:261995GMT
revoked:serialNumber=0272000005revocationDate=Mar2920:07:111995GMT
revoked:serialNumber=024100001FrevocationDate=Mar2419:44:331995GMT
revoked:serialNumber=024100001ArevocationDate=Mar1519:40:411995GMT
revoked:serialNumber=0241000016revocationDate=Mar1519:16:541995GMT
revoked:serialNumber=024100001BrevocationDate=Mar1318:40:491995GMT
revoked:serialNumber=024100000CrevocationDate=Feb2500:46:441995GMT
revoked:serialNumber=024100000FrevocationDate=Feb2400:12:491995GMT
revoked:serialNumber=0241000009revocationDate=Feb1002:16:391995GMT
revoked:serialNumber=0241000004revocationDate=Feb117:24:261995GMT
總結一下X.509證書是個什么東東吧。它實際上是建立了公共密鑰和某個實體之間聯系的數字化的文件。它包含的內容有:
版本信息,X.509也是有三個版本的。
系列號
證書接受者名稱
頒發者名稱
證書有效期
公共密鑰
一大堆的可選的其他信息
CA的數字簽名證書由CA頒發,由CA決定該證書的有效期,由該CA簽名。每個證書都有唯一的系列號。證書的系列號和證書頒發者來決定某證書的唯一身份。
openssl有四個驗證證書的模式。你還可以指定一個callback函數,在驗證證書的時候會自動調用該callback函數。這樣可以自己根據驗證結果來決定應用程序的行為。具體的東西在以后的章節會詳細介紹的。
openssl的四個驗證證書模式分別是:
SSL_VERIFY_NONE:完全忽略驗證證書的結果。當你覺得握手必須完成的話,就選用這個選項。其實真正有證書的人很少,尤其在中國。那么如果SSL運用于一些免費的服務,比如email的時候,我覺得server端最好采用這個模式。
SSL_VERIFY_PEER:希望驗證對方的證書。不用說這個是最一般的模式了.對client來說,如果設置了這樣的模式,驗證server的證書出了任何錯誤,SSL握手都告吹.對server來說,如果設置了這樣的模式,client倒不一定要把自己的證書交出去。如果client沒有交出證書,server自己決定下一步怎么做。
SSL_VERIFY_FAIL_IF_NO_PEER_CERT:這是server使用的一種模式,在這種模式下,server會向client要證書。如果client不給,SSL握手告吹。
SSL_VERIFY_CLIENT_ONCE:這是僅能使用在sslsessionrenegotiation階段的一種方式。什么是SSLsessionrenegotiation?以后的章節再解釋。我英文差點,覺得這個詞組也很難翻譯成相應的中文。以后的文章里,我覺得很難直接翻譯的單詞或詞組,都會直接用英文寫出來。如果不是用這個模式的話,那么在regegotiation的時候,client都要把自己的證書送給server,然后做一番分析。這個過程很消耗cpu時間的,而這個模式則不需要client在regotiation的時候重復送自己的證書了。openssl簡介-加密算法要理解ssl先要知道一些加密算法的常識.
加密算法很容易理解啦,就是把明文變成人家看不懂的東西,然后送給自己想要的送到的地方,接收方用配套的解密算法又把密文解開成明文,這樣就不怕在路世上如果密文給人家截獲而泄密。
加密算法有倆大類,第一種是不基于KEY的,舉個簡單的例子,我要加密"fordesign"這么一串字符,就把每個字符都變成它的后一個字符,那么就是"gpseftjhm"了,這樣的東西人家當然看不明白,接收方用相反的方法就可以得到原文。當然這只是個例子,現在應該沒人用這么搞笑的加密算法了吧。
不基于KEY的加密算法好象一直用到了計算機出現。我記得古中國軍事機密都是用這種方式加密的。打戰的時候好象軍隊那些電報員也要帶著密碼本,也應該是用這種方式加密的。這種算法的安全性以保持算法的保密為前提。
這種加密算法的缺點太明顯了,就是一旦你的加密算法給人家知道,就肯定掛。日本中途島慘敗好象就是密碼給老米破了。設計一種算法是很麻煩的,一旦給人破了就沒用了,這也忑浪費。
我們現在使用的加密算法一般是基于key的,也就是說在加密過程中需要一個key,用這個key來對明文進行加密。這樣的算法即使一次被破,下次改個key,還可以繼續用。key是一個什么東西呢?隨便你,可以是一個隨機產生的數字,或者一個單詞,啥都行,只要你用的算法認為你選來做key的那玩意合法就行。
這樣的算法最重要的是:其安全性取決于key,一般來說取決于key的長度。也就是說應該保證人家在知道這個算法而不知道key的情況下,破解也相當困難。其實現在常用的基于KEY的加密算法在網絡上都可以找到,很多革命同志(都是老外)都在想辦法破解基于key的加密算法又包括倆類:對稱加密和不對稱加密。對稱加密指的是雙方使用完全相同的key,最常見的是DES.DES3,RC4等。對稱加密算法的原理很容易理解,通信一方用KEK加密明文,另一方收到之后用同樣的KEY來解密就可以得到明文。
不對稱加密指雙方用不同的KEY加密和解密明文,通信雙方都要有自己的公共密鑰和私有密鑰。舉個例子比較容易理解,我們們假設通信雙方分別是A,B.A,擁有KEY_A1,KEY_A2,其中KEY_A1是A的私有密鑰,KEY_A2是A的公共密鑰。
B,擁有KEY_B1,KEY_B2,其中KEY_B1是B的私有密鑰,KEY_B2是B的公共密鑰。
公共密鑰和私有密鑰的特點是,經過其中任何一把加密過的明文,只能用另外一把才能夠解開。也就是說經過KEY_A1加密過的明文,只有KEY_A2才能夠解密,反之亦然。通信過程如下:
A>KEY_A2>B
A<KEY_B2<A
這個過程叫做公共密鑰交換,老外管這叫keyexchange.
之后A和B就分別用對方的公共密鑰加密,用自己的私有密鑰解密。
一般公共密鑰是要發布出去的,然后你通過自己的私有密鑰加密明文,人家用你的公共密鑰解密,如果能解開,那么說明你是加密人,這就是SSL使用的驗證機制。
常用的不對稱加密一般有RSA,DSA,DH等。我們一般使用RSA.
數字簽名也是不對稱加密算法的一個重要應用,理解它對于理解SSL很重要的,放在這里一起介紹一下。
簽名是什么大家都很熟悉吧?證明該東西是你寫的,是你發布的,你就用簽名搞定。看看那些重要文件都要頭頭簽名。數字簽名就是數字化的簽名了。記得公用密鑰和私有密鑰的特征嗎?只有你一個人有你自己的私有密鑰。而你的公用密鑰是其他人都知道的
了。那么你在寫完一封郵件之后,用自己的私有密鑰加密自己的名字,接收人用你的公共密鑰解開一看,哦,是你發的。這就是你的數字簽名過程了。
上面的解釋是很簡化的了,其實數字簽名比這個復雜多了,但我們沒有了解的必要,知道數字簽名是這么一回事就可以了。
還有一種我們需要知道的加密算法,其實我不覺得那是加密算法,應該叫哈希算法,英文是messagedigest,是用來把任何長度的一串明文以一定規則變成固定長度的一串字符串。它在SSL中的作用也很重要,以后會慢慢提及的。一般使用的是MD5,SHA.base64不是加密算法,但也是SSL經常使用的一種算法,它是編碼方式,用來把asc碼
和二進制碼轉來轉去的。
具體的加密解密過程我們不需要了解,因為SSL根本不關心。但了解加密算法的一些基本原理是必要的,否則很難理解SSL。
對加密算法的細節有興趣的同志,可以去網絡上找這些加密算法的原理的文章和實現的程序來研究,不過先學數論吧。不懂數論看那玩意還是一頭霧水。openssl簡介-協議SSL(SecureSocketLayer)是netscape公司提出的主要用于web的安全通信標準,分為2.0版和3.0版.TLS(TransportLayerSecurity)是IETF的TLS工作組在SSL3.0基礎之上提出的安全通信標準,目前版本是1.0,即RFC2246.SSL/TLS提供的安全機制可以保證應用層數據在互聯網絡傳輸不被監聽,偽造和竄改.
一般情況下的網絡協議應用中,數據在機器中經過簡單的由上到下的幾次包裝,就進入網絡,如果這些包被截獲的話,那么可以很容易的根據網絡協議得到里面的數據.由網絡監聽工具可以很容易的做到這一點。
SSL就是為了加密這些數據而產生的協議,可以這么理解,它是位與應用層和TCP/IP之間的一層,數據經過它流出的時候被加密,再往TCP/IP送,而數據從TCP/IP流入之后先進入它這一層被解密,同時它也能夠驗證網絡連接倆端的身份。
它的主要功能就是倆個:
一:加密解密在網絡中傳輸的數據包,同時保護這些數據不被修改,和偽造。
二:驗證網絡對話中雙方的身份
SSL協議包含倆個子協議,一個是包協議,一個是握手協議。包協議是說明SSL的數據包應該如何封裝的。握手協議則是說明通信雙方如何協商共同決定使用什么算法以及算法使用的key。很明顯包協議位于握手協議更下一層。我們暫時對包協議的內容沒有興趣。
SSL握手過程說簡單點就是:通信雙方通過不對稱加密算法來協商好一個對稱加密算法以及使用的key,然后用這個算法加密以后所有的數據完成應用層協議的數據交換。
握手一般都是由client發起的,SSL也不例外。
1client送給server它自己本身使用的ssl的version(ssl一共有三個version),加密算法的一些配置,和一些隨機產生的數據,以及其他在SSL協議中需要用到的信息。
2server送給client它自己的SSL的version,加密算法的配置,隨機產生的數據,還會用自己的私有密鑰加密SERVER-HELLO信息。Server還同時把自己的證書文件給送過去。同時有個可選的項目,就是server可以要求需要客戶的certificate。
3client就用server送過來的certificate來驗證server的身份。如果server身份驗證沒通過,本次通信結束。通過證書驗證之后,得到server的公共密鑰,解開server送來的被其用私有密鑰加密過的SERVER-HELLO信息,看看對頭與否。如果不對,說明對方只有該server的公共密鑰而沒有私有密鑰,必是假的。通信告吹。
4client使用到目前為止所有產生了的隨機數據(sharedsecret),client產生本次握
手中的premastersecret(這個步驟是有可能有server的參與的,由他們使用的加密算法決定),并且把這個用server的公共密鑰加密,送回給server.如果server要求需要驗
證client,那么client也需要自己把自己的證書送過去,同時送一些自己簽過名的數據過去。
SSL協議有倆種技術來產生sharedsecret(真不好意思,又是一個很難意譯的詞組),一種是RSA,一種是EDH.
RSA就是我們上一章說過的一種不對稱加密算法。首先server把自己的RSA公共密鑰送給client,client于是用這個key加密一個隨機產生的值(這個隨機產生的值就是sharedsecret),再把結果送給server.
EDH也是一種不對稱加密算法,但它與RSA不同的是,它好象沒有自己固定的公共密
鑰和私有密鑰,都是在程序跑起來的時候產生的,用完就K掉。其他的步驟倆者就差不多了。
RSA,DSA,DH三種不對稱加密算法的區別也就在這里。RSA的密鑰固定,后倆個需要一個參數來臨時生成key.DH甚至要求雙方使用同樣的參數,這個參數要事先指定。如果SSL庫沒有load進這個參數,DH算法就沒辦法用。DSA沒研究過。
5Server驗證完client的身份之后,然后用自己的私有密鑰解密得到premastersecret然后雙方利用這個premastersecret來共同協商,得到mastersecret.
6雙方用master一起產生真正的sessionkey,著就是他們在剩下的過程中的對稱加密的key了。這個key還可以用來驗證數據完整性。雙方再交換結束信息。握手結束。
接下來雙方就可以用協商好的算法和key來用對稱加密算法繼續下面的過程了。
很簡單吧?其實要復雜一些的,我簡化了很多來說。
不過還是有個問題,喜歡搗蛋的人雖然看不懂他們在交流些什么,但篡改總可以吧?記得我們在加密算法里面介紹過的哈希算法嗎?就是為了對付這種搗蛋者的。在每次送信息的時候,附帶把整條信息的哈希值也送過去,接收方收到信息的時候,也把收到的內容哈希一把,然后和對方送來的哈希值對比一下,看看是否正確。搗蛋者如果亂改通信內容,哈希出來的值是不同的,那么就很容易被發現了。
但這樣子,搗蛋者至少可以學舌。他可以把之前監聽到的內容重復發給某一方,而這些內容肯定是正確的,無法驗證出有問題的。哎,SSL是怎么對付這種人的我還沒看出來。有篇文章說:多放點隨機數在信息里可以對付,我也沒去研究這句話是什么意思。openssl簡介-入門實現了SSL的軟件不多,但都蠻優秀的。首先,netscape自己提出來的概念,當然自己會實現一套了。netscape的技術蠻優秀的,不過我沒用過他們的ssl-toolkit.甚至連名字都沒搞清楚。
1995年,eric.young開始開發openssl,那時候叫ssleay.一直到現在,openssl還在不停的修改和新版本的發行之中。openssl真夠大的,我真佩服eric的水平和興趣。這些open/free的斗士的精神是我寫這個系列的主要動力,雖然寫的挺煩的。ps:eric現在去了RSA公司做,做了一個叫SSL-C的toolkit,其實和openssl差不多。估計應該比openssl穩定,區別是這個是要銀子的,而且幾乎所有低層的函數都不提供直接調用了。那多沒意思。
去downopenssl吧,最新的是0.9.6版。
安裝是很簡單的。我一直用的是sunsparc的機器,所以用sunsparc的機器做例子。
gunzip-dopenssl.0.9.6.tar.gz
tar-xfopenssl.0.9.6.tar
mvopenssl.0.9.6openssl
cdopenssl
./configure--prefix=XXXXX--openssldir=XXXXXXXX
(這里prefix是你想安裝openssl的地方,openssldir就是你tar開的openssl源碼的地方。好象所有的出名點的freesoftware都是這個操行,configure,make,maketest,makeinstall,搞定。)
./make(如果機器慢,這一步的時候可以去洗個澡,換套衣服)
./maketest
./makeinstall
OK,如果路上沒有什么問題的話,搞定。
經常有人報bug,在hp-ux,sgi上裝openssl出問題,我沒試過,沒發言權。
現在可以開始玩openssl了。
注意:我估計openssl最開始是在linux下開發的。大家可以看一看在linxu下有這么一個文件:/dev/urandom,在sparc下沒有。這個文件有什么用?你可以隨時找它要一個隨機數。在加密算法產生key的時候,我們需要一顆種子:seed。這個seed就是找/dev/urandom要的那個隨機數。那么在sparc下,由于沒有這么一個設備,很多openssl的函數會報錯:"PRNGnotseeded".解決方法是:在你的~/.profile里面添加一個變量$RANDFILE,設置如下:
$RANDFILE=$HOME/.rnd
然后在$HOME下vi.rnd,隨便往里面亂輸入一些字符,起碼倆行。
很多openssl的函數都會把這個文件當seed,除了opensslrsa,希望openssl盡快修改這個bug.
如果用openssl做toolkit編程,則有其他不太安全的解決方法。以后講到openssl編程的章節會詳細介紹。
先生成自己的私有密鑰文件,比如叫server.key
opensslgenrsa-des3-outserver.key1024
genras表示生成RSA私有密鑰文件,-des3表示用DES3加密該文件,1024是我們的key的長度。一般用512就可以了,784可用于商業行為了,1024可以用于軍事用途了。
當然,這是基于現在的計算機的速度而言,可能沒過幾年1024是用于開發測試,2048用于一般用途了。
生成server.key的時候會要你輸入一個密碼,這個密鑰用來保護你的server.key文件,這樣即使人家偷走你的server.key文件,也打不開,拿不到你的私有密鑰。
opensslrsa-noout-text-inserver.key
可以用來看看這個key文件里面到底有些什么東西(不過還是看不懂)
如果你覺得server.key的保護密碼太麻煩想去掉的話:
opensslrsa-inserver.key-outserver.key.unsecure
不過不推薦這么做
下一步要得到證書了。得到證書之前我們要生成一個CertificateSigningRequest.
CA只對CSR進行處理。
opensslreq-new-keyserver.key-outserver.csr
生成CSR的時候屏幕上將有提示,依照其指示一步一步輸入要求的信息即可.
生成的csr文件交給CA簽名后形成服務端自己的證書.怎么交給CA簽名?
自己去慢慢看吧。
如果是自己玩下,那么自己來做CA吧。openssl有很簡單的方法做CA.但一般只好在開發的時候或者自己玩的時候用,真的做出產品,還是使用正規的CA簽發給你的證書吧
在你makeinstall之后,會發現有個misc的目錄,進去,運行CA.sh-newca,他會找你要CA需要的一個CA自己的私有密鑰密碼文件。沒有這個文件?按回車創建,輸入密碼來保護這個密碼文件。之后會要你的一個公司信息來做CA.crt文件。最后在當前目錄下多了一個./demoCA這樣的目錄../demoCA/private/cakey.pem就是CA的key文件啦,
./demoCA/cacert.pem就是CA的crt文件了。把自己創建出來的server.crt文件copy到misc目錄下,mv成newreq.pem,然后執行CA.sh-sign,ok,
得到回來的證書我們命名為server.crt.
看看我們的證書里面有些什么吧
opensslx509-noout-text-inserver.crt
玩是玩過了,openssl的指令繁多,就象天上的星星。慢慢一個一個解釋吧。openssl簡介-指令verify用法:
opensslverify【-CApathdirectory】【-CAfilefile】【-purposepurpose】【-untrustedfile】【-help】【-issuer_checks】【-verbose】【-】【certificates】
說明:
證書驗證工具。
選項
-CApathdirectory
我們信任的CA的證書存放目錄。這些證書的名稱應該是這樣的格式:
xxxxxxxx.0(xxxxxxxx代表證書的哈希值。參看x509指令的-hash)
你也可以在目錄里touch一些這樣格式文件名的文件,符號連接到真正的證書。
那么這個xxxxxxxx我怎么知道怎么得到?x509指令有說明。
其實這樣子就可以了:
opensslx509-hash-inserver.crt
-CAfilefile
我們信任的CA的證書,里面可以有多個CA的證書。
-untrustedfile
我們不信任的CA的證書。
-purposepurpose
證書的用途。如果這個option沒有設置,那么不會對證書的CA鏈進行驗證。
現在這個option的參數有以下幾個:
sslclinet
sslserver
nssslserver
smimesign
smimeencrypt
等下會詳細解釋的。
-help
打印幫助信息。
-verbose
打印出詳細的操作信息。
-issuer_checks
打印出我們驗證的證書的簽發CA的證書的之間的聯系。
要一次驗證多個證書,把那些證書名都寫在后面就好了。
驗證操作解釋:
S/MIME和本指令使用完全相同的函數進行驗證。
我們進行的驗證和真正的驗證有個根本的區別:
在我們對整個證書鏈進行驗證的時候,即使中途有問題,我們也會驗證到最后,而真實的驗證一旦有一個環節出問題,那么整個驗證過程就告吹。
驗證操作包括幾個獨立的步驟。
首先建立證書鏈,從我們目前的證書為基礎,一直上溯到RootCA的證書.
如果中間有任何問題,比如找不到某個證書的頒發者的證書,那么這個步驟就掛。有任何一個證書是字簽名的,就被認為是RootCA的證書。
尋找一個證書的頒發CA也包過幾個步驟。在openssl0.9.5a之前的版本,如果一個證書的頒發者和另一個證書的擁有著相同,就認為后一個證書的擁有者就是前一個證書的簽名CA.
openssl0.9.6及其以后的版本中,即使上一個條件成立,還要進行更多步驟的檢驗。包括驗證系列號等。到底有哪幾個我也沒看明白。
得到CA的名稱之后首先去看看是否是不信任的CA,如果不是,那么才去看看是否是信任的CA.尤其是RootCA,更是必須是在信任CA列表里面。
現在得到鏈條上所有CA的名稱和證書了,下一步是去檢查第一個證書的用途是否和簽發時候批準的一樣。其他的證書則必須都是作為CA證書而頒發的。
證書的用途在x509指令里會詳細解釋。
過了第二步,現在就是檢查對RootCA的信任了。可能RootCA也是每個都負責不同領域的證書簽發。缺省的認為任何一個RootCA都是對任何用途的證書有簽發權。
最后一步,檢查整條證書鏈的合法性。比如是否有任何一個證書過期了?簽名是否是正確的?是否真的是由該證書的頒發者簽名的?
任何一步出問題,所有該證書值得懷疑,否則,證書檢驗通過。
如果驗證操作有問題了,那么打印出來的結果可能會讓人有點模糊。
一般如果出問題的話,會有類似這樣子的結果打印出來:
server.pem:/C=AU/ST=Queensland/O=CryptSoftPtyLtd/CN=TestCA(1024bit)
error24at1depthlookup:invalidCAcertificate
第一行說明哪個證書出問題,后面是其擁有者的名字,包括幾個字段。
第二行說明錯誤號,驗證出錯在第幾層的證書,以及錯誤描述。
下面是錯誤號及其描述的詳細說明,注意,有的錯誤雖然有定義,
但真正使用的時候永遠不會出現。用unused標志.
0X509_V_OK
驗證操作沒有問題
2X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT
找不到該證書的頒發CA的證書。
3X509_V_ERR_UNABLE_TO_GET_CRL(unused)
找不到和該證書相關的CRL
4X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE
無法解開證書里的簽名。
5X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE(unused)
無法解開CRLs的簽名。
6X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY
無法得到證書里的公共密鑰信息。
7X509_V_ERR_CERT_SIGNATURE_FAILURE
證書簽名無效
8X509_V_ERR_CRL_SIGNATURE_FAILURE(unused)
證書相關的CRL簽名無效
9X509_V_ERR_CERT_NOT_YET_VALID
證書還沒有到有效開始時間
10X509_V_ERR_CRL_NOT_YET_VALID(unused)
與證書相關的CRL還沒有到有效開始時間
11X509_V_ERR_CERT_HAS_EXPIRED
證書過期
12X509_V_ERR_CRL_HAS_EXPIRED(unused)
與證書相關的CRL過期
13X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD
證書的notBefore字段格式不對,就是說那個時間是非法格式。
14X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD
證書的notAfter字段格式不對,就是說那個時間是非法格式。
15X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD(unused)
CRL的lastUpdate字段格式不對。
16X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD(unused)
CRL的nextUpdate字段格式不對
17X509_V_ERR_OUT_OF_MEM
操作時候內存不夠。這和證書本身沒有關系。
18X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
需要驗證的第一個證書就是字簽名證書,而且不在信任CA證書列表中。
19X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN
可以建立證書鏈,但在本地找不到他們的根??
:selfsignedcertificateincertificatechain
thecertificatechaincouldbebuiltupusingtheuntrustedcertificates
buttherootcouldnotbefoundlocally.
20X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
有一個證書的簽發CA的證書找不到。這說明可能是你的RootCA的證書列表不齊全。
21X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE
證書鏈只有一個item,但又不是字簽名的證書。
22X509_V_ERR_CERT_CHAIN_TOO_LONG(unused)
證書鏈太長。
23X509_V_ERR_CERT_REVOKED(unused)
證書已經被CA宣布收回。
24X509_V_ERR_INVALID_CA
某CA的證書無效。
25X509_V_ERR_PATH_LENGTH_EXCEEDED
參數basicConstraintspathlentgh超過規定長度
26X509_V_ERR_INVALID_PURPOSE
提供的證書不能用于請求的用途。
比如鏈條中某個證書應該是用來做CA證書的,但證書里面的該字段說明該證書不是用做CA證書的,就是這樣子的情況。
27X509_V_ERR_CERT_UNTRUSTED
RootCA的證書如果用在請求的用途是不被信任的。
28X509_V_ERR_CERT_REJECTED
CA的證書根本不可以用做請求的用途。
29X509_V_ERR_SUBJECT_ISSUER_MISMATCH
證書頒發者名稱和其CA擁有者名稱不相同。-issuer_checks被set的時候可以檢驗出來。
30X509_V_ERR_AKID_SKID_MISMATCH
證書的密鑰標志和其頒發CA為其指定的密鑰標志不同.
31X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH
證書系列號與起頒發CA為其指定的系列號不同。
32X509_V_ERR_KEYUSAGE_NO_CERTSIGN
某CA的證書用途不包括為其他證書簽名。
50X509_V_ERR_APPLICATION_VERIFICATION
應用程序驗證出錯。
openssl簡介-指令asn1parse
用法:opensslasn1parse[-informPEM|DER][-infilename][-outfilename]
[-noout][-offsetnumber][-lengthnumber][-i][-structurefilename]
[-strparseoffset]
用途:一個診斷工具,可以對ASN1結構的東東進行分析。
ASN1是什么?一個用來描述對象的標準。要解釋的話,文章可以比解釋openssl結構的文章更長。有興趣的話自己去網絡上找來看吧。
-informDER|PEM|TXT
輸入的格式,DER是二進制格式,PEM是base64編碼格式,TXT不用解釋了吧
-infilename
輸入文件的名稱,缺省為標準輸入。
-outfilename
輸入文件的名稱,輸入一般都是DER數據。如果沒這個項,就沒有東西輸入咯。該項一般都要和-strparse一起使用。
-noout
不要輸出任何東西(不明白有什么用)
-offsetnumber
從文件的那里開始分析,看到offset就應該知道是什么意思了吧。
-lengthnumber
一共分析輸入文件的長度的多少,缺省是一直分析到文件結束。
-i
根據輸出的數據自動縮進。
-structurefilename
當你輸入的文件包含有附加的對象標志符的時候,使用這個。
這種文件的格式在后面會介紹。
-strparseoffset
從由offset指定的偏移量開始分析ASN1對象。當你碰到一個嵌套的對象時,可以反復使用這個項來一直進到里面的結構捏出你需要的東東。
一般分析完之后輸入的東東如下:
opensslasn1parse-outtemp.ans-i-informpem<server.crt
0:d=0hl=4l=881cons:SEQUENCE
4:d=1hl=4l=730cons:SEQUENCE
...
172:d=3hl=2l=13prim:UTCTIME:000830074155Z
187:d=3hl=2l=13prim:UTCTIME:010830074155Z
202:d=2hl=3l=136cons:SEQUENCE
205:d=3hl=2l=11cons:SET
......
359:d=3hl=3l=141prim:BITSTRING
......
本例是一個自簽名的證書。每一行的開始是對象在文件里的偏移量。d=xx是結構嵌套的深度。知道ASN1結構的人應該知道,每一個SET或者SEQUENCE都會讓嵌套深度增加1.
hl=xx表示當前類型的header的長度。1=xx表示內容的八進制的長度。
-i可以讓輸出的東西容易懂一點。
如果沒有ASN.1的知識,可以省略看這一章。
本例中359行就是證書里的公共密鑰。可以用-strparse來看看
opensslasn1parse-outtemp.ans-i-informpem-strparse359<server.crt
0:d=0hl=3l=137cons:SEQUENCE
3:d=1hl=3l=129prim:INTEGER:C0D802B4C084B20569C619C0FDF
466EEB7980920A408D51DA22C20427AC32488665D931C41E3274912DE2F25C8CA9C97B75
415C01794B622DBEADD92DA068C140C3AD387BF5FDC9A8D2FCEE7F7F3E36B0194994FD67
07897C8969F16F6ECB3F03BF985E910817160FE5DCBF874B1C0DBD06A568E130DA7C9FE3
9FE7A7F421369
135:d=1hl=2l=3prim:INTEGER:010001
不要試圖去看temp.ans的內容,是二進制來的,看不懂的。openssl簡介-指令ca(一)用途:
模擬CA行為的工具.有了它,你就是一個CA,不過估計是nobodytrustedCA.可以用來給各種格式的CSR簽名,用來產生和維護CRL(不記得CRL是什么了?去看證書那一章).他還維護著一個文本數據庫,記錄了所有經手頒發的證書及那些證書的狀態。
用法:
opensslca[-verbose][-configfilename][-namesection][-gencrl]
[-revokefile][-crldaysdays][-crlhourshours][-crlextssection]
[-startdatedate][-enddatedate][-daysarg][-mdarg][-policyarg]
[-keyfilearg][-keyarg][-passinarg][-certfile][-infile]
[-outfile][-notext][-outdirdir][-infiles][-spkacfile]
[-ss_certfile][-preserveDN][-batch][-msie_hack][-extensionssection]
哇噻,好復雜也。不過用過GCC的人應該覺得這么點flag還是小case.
-configfilename
指定使用的configure文件。
-infilename
要簽名的CSR文件。
-ss_certfilename
一個有自簽名的證書,需要我們CA簽名,就從這里輸入文件名。
-spkacfilename
這一段實在沒有看懂,也沒興趣,估計和SPKAC打交道可能性不大,奉送上英文原文。
afilecontainingasingleNetscapesignedpublickeyandchallengeandadditionalfieldvaluestobesignedbytheCA.SPKACFORMAT
Theinputtothe-spkaccommandlineoptionisaNetscapesignedpublickeyandchallenge.ThiswillusuallycomefromtheKEYGENtaginanHTMLformtocreateanewprivatekey.ItishoweverpossibletocreateSPKACsusingthespkacutility.
ThefileshouldcontainthevariableSPKACsettothevalueoftheSPKACandalsotherequiredDNcomponentsasnamevaluepairs.Ifyouneedtoincludethesamecomponenttwicethenitcanbeprecededbyanumberanda.
-infiles
如果你一次要給幾個CSR簽名,就用這個來輸入,但記得這個選項一定要放在最后。這個項后面的所有東東都被認為是CSR文件名參數。
-outfilename
簽名后的證書文件名。證書的細節也會給寫進去。
-outdirdirectory
擺證書文件的目錄。證書名就是該證書的系列號,后綴是.pem
-cert
CA本身的證書文件名
-keyfilefilename
CA自己的私有密鑰文件
-keypassword
CA的私有密鑰文件的保護密碼。
在有的系統上,可以用ps看到你輸入的指令,所以這個參數要小心點用。
-passinarg
也是一個輸入私有密鑰保護文件的保護密碼的一種方式,可以是文件名,設備名或者是有名管道。程序會把該文件的第一行作為密碼讀入。(也蠻危險的)。
-verbose
操作過程被詳細printf出來
-notext
不要把證書文件的明文內容輸出到文件中去。
-startdatedate
指明證書的有效開始日期。格式是YYMMDDHHMMSSZ,同ASN1的UTCTime結構相同。
-enddatedate
指明證書的有效截止日期,格式同上。
-daysarg
指明給證書的有效時間,比如365天。
-mdalg
簽名用的哈希算法,比如MD2,MD5等。
-policyarg
指定CA使用的策略。其實很簡單,就是決定在你填寫信息生成CSR的時候,哪些信息是我們必須的,哪些不是。看看config文件里面的policy這個item就明白了。
-msie_hack
為了和及其古老的證書版本兼容而做出的犧牲品,估計沒人會用的,不解釋了。
-preserveDN
和-msie_hack差不多的一個選項。
-batch
設置為批處理的模式,所有的CSR會被自動處理。
-extensionssection
我們知道一般我們都用X509格式的證書,X509也有幾個版本的。如果你在這個選項后面帶的那個參數在config文件里有同樣名稱的key,那么就頒發X509V3證書,否則頒發X509v1證書。
還有幾個關于CRL的選項,但我想一般很少人會去用。我自己也沒興趣去研究。
有興趣的自己看看英文吧。
CRLOPTIONS
-gencrl
thisoptiongeneratesaCRLbasedoninformationintheindexfile.
-crldaysnum
thenumberofdaysbeforethenextCRLisdue.Thatisthedaysfrom
nowtoplaceintheCRLnextUpdatefield.
-crlhoursnum
thenumberofhoursbeforethenextCRLisdue.
-revokefilename
afilenamecontainingacertificatetorevoke.
-crlextssection
thesectionoftheconfigurationfilecontainingCRLextensionsto
include.IfnoCRLextensionsectionispresentthenaV1CRLiscreated,
iftheCRLextensionsectionispresent(evenifitisempty)thenaV2
CRLiscreated.TheCRLextensionsspecifiedareCRLextensionsandnot
CRLentryextensions.Itshouldbenotedthatsomesoftware(fore
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設計單位保密管理制度
- 訪問權限分配管理制度
- 訴訟仲裁案件管理制度
- 診所收費制度管理制度
- 診療項目內部管理制度
- 財務資產報告管理制度
- 財政實行臺賬管理制度
- 貨代公司物流管理制度
- 貨物源頭車輛管理制度
- 貨車司機績效管理制度
- 玉溪市2025年事業單位公開招聘工作人員筆試歷年典型考題及考點剖析附帶答案詳解
- 國內在線教育的發展狀況研究論文3000字
- 2025-2030中國激光噴碼機行業市場發展分析及發展趨勢與投資前景研究報告
- 2025屆新高考志愿填報指南課件
- 2025北京新版房屋租賃合同(合同示范文本)
- GB/T 16311-2024道路交通標線質量要求和檢測方法
- 2024年重慶市初中學業水平考試地理試卷試題真題(含答案詳解)
- 遇見朗讀者智慧樹知到期末考試答案章節答案2024年哈爾濱師范大學
- 火龍罐技術課件
- 法律職業倫理(第二版)完整版教學課件全書電子講義(最新)
- 《老年患者低鈉血癥的診治中國專家建議》要點(完整版)
評論
0/150
提交評論