㈠ 如何查看證書的16進制der編碼,及證書的各個域der格式
證書一般都是x.509格式的證書,然後經過DER編碼,DER是TLV編碼,然後再經過base64編碼後存儲的。
正確的方法,應該是,把證書文件,用binary方式,傳送到linux下,然後用linux中的base64來進行文件解 碼。
命令如下:base64
-d -i ca.crt > crt.hex
-d的命令是,然後-i是--ignore-garbage
When decoding, ignore non-alphabet characters.
Decoding
require compliant input by default, use --ignore-garbage to
attempt to
recover from non-alphabet characters (such as newlines) in
the encoded
stream.
然後再用vim打開crt.hex,這時候再轉換成16進制,就可以查看到正常的證書16進制的DER編碼了。
㈡ RSA公鑰只返回一串base64字元 怎麼使用
正常的情況下RSA公鑰是不會只返回一串base64編碼的。我們從原理上說起:
RSA密鑰對有很多個參數,d /dp/dq/Expoent/InverseQ/Molus/p/q,原理上我們是知道他是由兩個大素數p和q的乘積,正常的情況下含有私鑰的文件會反這些參數全部給出,而如果只給出公鑰時,事實上是給定了n(Moles)和e(Exponent)兩個參數,這兩個參數可以用來加密,我們也都知道,如何將這兩個參數有效地傳遞給另一方呢?或者說我們把這兩個參數如何給其他人呢,這個就是我們常說的公鑰文件,當然有什麼pfx等等,但這里我們如果簡要地傳遞給第二方時,我們會經常使用一個對象RSAParameters類,這個對象就是這幾個參數,如果我需要傳遞給你時,有效的方式就是把RSAParameters序列化,然後把序列化的內容給你就可以了。
在C#中有兩種常用的序列化形式,一種就是byte序列化,一種就是xml序列化(一般使用JSON序列化的時候不多,因為javascript對實現RSA原生支技較為復雜)。
byte序列化不適合在網路上傳輸,所以一般都使用XML序列化,xml適合網上傳輸,他會把二進制自動序列化為base64編碼。而事實上RSAParameters類和幾個參數全是byte類型的(方便存儲超大數字),所以會序列化成如下形式:
<RSAKeyValue>
<Molus>…</Molus>
<Exponent>…</Exponent>
<P>…</P>
<Q>…</Q>
<DP>…</DP>
<DQ>…</DQ>
<InverseQ>…</InverseQ>
<D>…</D>
</RSAKeyValue>
很明顯這是一個序列化後的xml形式,其中幾個參數都是被自動序列化成base64編碼,如果是公鑰的話,其中<Molus>和<Exponent>兩個參數有值,其他的在序列化過程中如果沒有值不序列化,所以你可以最終看到只有這兩個參數的一個結構。
PS:序列化與反序列化由RSACryptoServiceProvider類的ToXmlString(bool)執行,其中參數表示是否含有私鑰,如果是則全部參數都會存在,否則只含有公鑰。拿到這個文件時,可以直接使用FromXmlString(string)進行導入即可使用。
但事實上,RSACryptoServiceProvidder提供的不僅有ToXmlString()方法,還存在有ExportCspBlob()方法和ExportRSAParameter()方法。導出RSAParameter方法不用說了,基本上用於本地版本,就是導出一個RSAParameter結構,而ExportCspBlob方法與ToXmlString()有一定的比較性,它導出的是一個二進制的形式,也就是二進制序列化後的數值,由於其是二進制形的數值。但兩種形式的序列化雖然都是序列化RSAParameter結構,但並沒有讓你直接使用XmlSerializer類進行序列化,而由於RSACryptoServiceProvider中的方法已經實現了,當然反序列化也是同理。
但由我們在使用.net自動生成公私鑰時,其Exponent參數永遠是65537(ABAQ),其實對於.net自動生成的公私鑰對算是一個測試的公私鑰對,所以它保證了Exponent為固定的一個值。所以很多人不太明白這個道理,以為真正使用的公私有對的e都一定被選定為該值,所以有一類人為了「節省」帶寬,自做主張在傳遞公鑰時只傳遞了一個Molus的值!換句話來說,這些非商用的情況下的可行的,而且在商用的情況下也有一定的可行性。這里你可能只看到對方傳遞的是一個base64編碼——這種情況顯然不是規范的,所以盡量不使用或少使用,如果某企業有自己的證書或提供自己的公鑰時,這種情況顯然會導致你重新修改程序。但這也是你見到全是base64編碼的原因。(他只傳遞了molus的值 ,而不是RSAParameter序列化結構)。
另外一類的程序員,喜歡造輪子,或者是他們喜歡上了ExportCspBlob()和ImportCspBlob()兩個方法,不管是本地還是網路傳輸,可憐他們只會用一對的方法,總是不知道ToXmlString()和FromXmlString()這一對方法是用來干什麼的。所以他們愛好就是動不動用ExportCspBlob()方法導出公鑰或私鑰對。如果是本地程序這當然沒有問題,但如果是遠程的話,也使用這個,但導出的一堆byte他們沒辦法通過網路(我指的html之類的通訊,不是CS模式下)傳輸,當然有,遇到我們沒有傳遞二進制時設計成編碼就可以了。所以指出了一堆二進制之後,把這個二進制進行base64編碼來傳遞——這種情況我見到的最多!如果你看到這種的一堆base64時,需要先手式把base64編碼轉換成二進制,然後使用ImportCspBlob()方法再導入進去。這種情況看起來沒有大問題,但實際上是繞了一個圈圈,感情就會使用ExportCspBlob()方法,為什麼不直接考慮使用ToXmlString()方法呢?所以我看到很多情況下base64位編碼基本上都屬於這種情況!
事實上,我的建議是,如果是本地存儲的情況下,比如需要存儲成一個文件,這時可以使用ExportCspBlob()方法導到成byte數組,然後可以直接將該數組寫入到dat文件中,以方便其他時間的使用;如果是網路傳輸的情況下,因涉及到網路協議的問題,二進制流傳輸還行,但如果是文本流傳輸時使用ToXmlString()方法導出,可以直接讓其他程序使用。雖然在微軟上沒有這么規定,但如果你這么使用卻是一個很恰當的使用場景(二進制序列化時,由於參數的值本身就是二進制,所以它序列化時其他最為簡單,那些個二進制的值不需要任何的編碼處理,所以性能會高一些,而xml序列化則涉及到二進制的編碼,所以性能上沒有直接二進制高,但如果你先導出成二進制,再base64編碼,就讓人難以想通了,完全屬於對.net類庫不熟悉而造成的!很多人可能會說,其他語言中導到的二進制——如果基於這種考慮,理由似乎說得過去,但至少常見的語言中還都是支持xml形式的,包括javascript新版語言原生支持RSA,它只支持xml形式和JSON形式,並不支持二進制形式。所以先導出二進制再編碼base64形式純屬多餘)。
PS:這一點更為重要,不少人把RSA的公私鑰對導出後直接保存成文件,事實上我也這么說了,但是在windows中,盡量避免這樣做,除非你要對機器進行遷移時或者其他原因需要,否則不要大搖大擺地把公私鑰對存儲成一個文件,如果被別有用心的人拿了去,你自己想想後果是什麼樣的!windows本身提供了一種叫密鑰容器的機制,可以存儲DSA/RSA/DES/TDES等非對稱或對稱密鑰的安全存儲。應當使用這種安全存儲的機制,而不是把公鑰密文件大搖大擺在丟在某個目錄下。關於密鑰容器的問題,你可以查閱MSDN上,可以直接使用的。類似的情況還有,某些情況下我們從CA(認證中心)獲得一個證書時,也是把證書導入到容器中,然後設置導出密碼,銷毀原證書文件。如果在遷移時,可以使用密鑰導出私鑰證書,然後再到其他機器上安裝。很多人不太理解這樣做的目的,其實密鑰管理還涉及到一個人員管理的問題,這樣證書只會經過某個特定的人進行處理,其他任何人都無法拿到該證書,但他們可以使用,所以這樣做是十分安全的。
㈢ 如何將文件中Base64進制數據生成X509證書
很簡單,你雙擊user.p7b,打開證書-當前用戶下拉菜單,選中對應文件夾,然後裡面有個證書的文件夾,裡面應該有幾個證書,看一下對應的是哪一級。一般域名或者IP的是伺服器證書,右鍵點擊它,然後點擊所有任務,點擊導出然後點擊下一步,選擇base...
㈣ java如何解讀證書里的內容(通過string 來生成X509Certificate對象)
那個字元串是Base64編碼後的
試著把String 轉成inputStream,
InputStream inStream = new ByteArrayInputStream(caString.getBytes('UTF-8'));用這句替代 上面寫的第二行代碼。但是在執行版第四行的權時候報錯。。
java.security.cert.CertificateException: Could not parse certificate: java.io.IOException: Unsupported encoding
㈤ 如何導出cer證書的Base64編碼信息
1、將證書雙擊,安裝到IE中,如果是個人證書會安裝到:在IE的 工具 -> internet選項 -> 內容 -> 證書 -> 個人
2、打開IE,在在IE的 工具 -> internet選項 -> 內容 -> 證書 -> 個人 中,找到這張證書,選中它
3、點擊「導出」按鈕
4、點擊「下一步」,再點擊「下一步」
5、選擇「Base64編碼X.509(.cer)」
6、點擊「下一步」,一直到保存完畢
OK,cer證書的Base64編碼格式已經生成完畢。
㈥ 如何獲得證書的BASE64編碼
這幾天項目中需要使用到BASE64格式的證書信息,我就從IE中導出證書,裡面有可選項,你可以選擇不需要導出證書私鑰,然後選擇導出BASE64編碼格式X.509的證書,即.CER格式的證書,導出到本地之後,使用UE之類的工具打開之後就可以看見裡面的信息,類似這種-----BEGIN CERTIFICATE-----
㈦ 數字證書的證書格式
數字證書的格式普遍採用的是X.509V3 國際標准,一個標準的 X.509 數字證書包含以下一些內容:
1、證書的版本信息;
2、證書的序列號,每個證書都有一個唯一的證書序列號;
3、證書所使用的簽名演算法;
4、證書的發行機構名稱,命名規則一般採用X.500格式;
5、證書的有效期,通用的證書一般採用UTC時間格式,它的計時范圍為1950-2049;
6、證書所有人的名稱 (Subject),命名規則一般採用X.500格式;
7、證書所有人的公鑰;
8、證書發行者 (Issuer) 對證書的簽名。
(7)證書base64擴展閱讀
數字證書主要具以下三方面特徵:
第一,安全性。
用戶申請證書時會有兩份不同證書,分別用於工作電腦以及用於驗證用戶的信息交互,若所使用電腦不同,用戶就需重新獲取用於驗證用戶所使用電腦的證書,而無法進行備份,這樣即使他人竊取了證書,也無法獲取用戶的賬戶信息,保障了賬戶信息。
第二,唯一性。
數字證書依用戶身份不同給予其相應的訪問許可權,若換電腦進行賬戶登錄,而用戶無證書備份,其是無法實施操作的,只能查看賬戶信息。
第三,便利性。
用戶可即時申請、開通並使用數字證書,且可依用戶需求選擇相應的數字證書保障技術。用戶不需要掌握加密技術或原理,就能夠直接通過數字證書來進行安全防護,十分便捷高效。
㈧ https(SSL/TLS)數字證書中的公鑰參數(Public Key parameters)0500是什麼含義
微軟詳細:https://msdn.microsoft.com/en-us/library/windows/desktop/aa379059(v=vs.85).aspx
參數介紹:https://msdn.microsoft.com/en-us/library/windows/desktop/aa379057(v=vs.85).aspx
...
公鑰演算法:
演算法ObjectId:1.2.840.113549.1.1.1 RSA(RSA_SIGN)
演算法參數:
05 00
...
我想幫你分解你正在看的東西。
如果你拿你的base64字元串:
+ / / 3J + skZ6UtW +
然後將其解碼為十六進制:
30 81 9F 30 0D 06 09 2A 86 48 86 F7 0D 01 01 01
05 00 03 81 8D 00 30 81 89 02 81 81 00 AA 18 AB
A4 3B 50 DE EF 38 59 8F AF 87 D2 AB 63 4E 45 71
C1 30 A9 BC A7 B8 78 26 74 14 FA AB 8B 47 1B D8
96 5F 5C 9F C3 81 84 85 EA F5 29 C2 62 46 F3 05
50 64 A8 DE 19 C8 C3 38 BE 54 96 CB AE B0 59 DC
0B 35 81 43 B4 4A 35 44 9E B2 64 11 31 21 A4 55
BD 7F DE 3F AC 91 9E 94 B5 6F B9 BB 4F 65 1C DB
23 EA D4 39 D6 CD 52 3E B0 81 91 E7 5B 35 FD 13
A7 41 9B 30 90 F2 47 87 BD 4F 4E 19 67 02 03 01
00 01
所以問題是:這是什麼?那實際上是ASN.1編碼的DER變體。ASN.1是一個可怕的怪物,但價值實際上是這樣的:
30 81 9F ;30=SEQUENCE (0x9F = 159 bytes)
| 30 0D ;30=SEQUENCE (0x0D = 13 bytes)
| | 06 09 ;06=OBJECT_IDENTIFIER (0x09 = 9 bytes)
| | 2A 86 48 86 ;Hex encoding of 1.2.840.113549.1.1
| | F7 0D 01 01 01
| | 05 00 ;05=NULL (0 bytes)
| 03 81 8D 00 ;03=BIT STRING (0x8d = 141 bytes)
| | 30 81 89 ;30=SEQUENCE (0x89 = 137 bytes)
| | | 02 81 81 ;02=INTEGER (0x81 = 129 bytes) the molus
| | | 00 ;leading zero of INTEGER
| | | AA 18 AB A4 3B 50 DE EF 38 59 8F AF 87 D2 AB 63
| | | 4E 45 71 C1 30 A9 BC A7 B8 78 26 74 14 FA AB 8B
| | | 47 1B D8 96 5F 5C 9F C3 81 84 85 EA F5 29 C2 62
| | | 46 F3 05 50 64 A8 DE 19 C8 C3 38 BE 54 96 CB AE
| | | B0 59 DC 0B 35 81 43 B4 4A 35 44 9E B2 64 11 31
| | | 21 A4 55 BD 7F DE 3F AC 91 9E 94 B5 6F B9 BB 4F
| | | 65 1C DB 23 EA D4 39 D6 CD 52 3E B0 81 91 E7 5B
| | | 35 FD 13 A7 41 9B 30 90 F2 47 87 BD 4F 4E 19 67
| | 02 03 ;02=INTEGER (0x03 = 3 bytes) - the exponent
| | | 01 00 01 ;hex for 65537
所以編碼在十六進制中有兩個重要的數字:
指數:(65537 幾乎每個人普遍使用65,537作為主要指數)
模數:00 AA 18 AB A4 3B 50 DE EF 38 59 8F AF 87 D2 AB 63 4E 45 71 C1 30 A9 BC A7 B8 78 26 74 14 FA AB 8B 47 1B D8 96 5F 5C 9F C3 81 84 85 EA F5 29 C2 62 46 F3 05 50 64 A8 DE 19 C8 C3 38 BE 54 96 CB AE B0 59 DC 0B 35 81 43 B4 4A 35 44 9E B2 64 11 31 21 A4 55 BD 7F DE 3F AC 91 9E 94 B5 6F B9 BB 4F 65 1C DB 23 EA D4 39 D6 CD 52 3E B0 81 91 E7 5B 35 FD 13 A7 41 9B 30 90 F2 47 87 BD 4F 4E 19 67
或者,在十進制中,你的模數是:
119,445,732,379,544,598,056,145,200,053,932,732,877,863,846,799,652,384,989,588,303,737,527,328,743,970,559,883,211,146,487,286,317,168,142,202,446,955,508,902,936,035,124,709,397,221,178,664,495,721,428,029,984,726,868,375,359,168,203,283,442,617,134,197,706,515,425,366,188,396,513,684,446,494,070,223,079,865,755,643,116,690,165,578,452,542,158,755,074,958,452,695,530,623,055,205,290,232,290,667,934,914,919
㈨ 如何從user.p7b,導出base64格式的根證和伺服器證書,需要詳細步驟
很簡單,你雙擊user.p7b,打開證書-當前用戶下拉菜單,選中對應文件夾,然後裡面有個證書的文件夾,裡面應該有幾個證書,看一下對應的是哪一級。一般域名或者IP的是伺服器證書,右鍵點擊它,然後點擊所有任務,點擊導出然後點擊下一步,選擇base64格式,也就是cer格式。導出根證書操作一樣。請採納。