LDAP userSMIMECertificate 屬性的內容究竟是什麼?
我正在嘗試使用使用者證書設置 LDAP。我已經了解到證書可以以
userCertificate
DER 格式或userSMIMECertificate
PKCS#7 格式儲存在屬性中,後者的優點是能夠包含完整的證書鏈,以及支持的 S/MIME 算法和/或客戶的首選。但是,我正在為必須使用 PKCS#7 格式的哪些變體而苦苦掙扎。我可以將證書導出為
p7b
文件,據我所知,它只是一個包含多個證書的證書包,但沒有更多資訊。
userSMIMECertificate
顯然需要一個(簽名?)沒有(或至少可以忽略不計)消息文本的 CMS 消息。這是p7m
電子郵件客戶端創建的格式嗎?但這似乎是加密的?如何創建所需的userSMIMECertificate
格式?
奇怪的。我首先嘗試在 Cryptography 上詢問 + 發帖,然後說我的問題超出了範圍。所以搬到了stackexchange,然後也說超出了範圍。無論如何,在這個問題上與其他人(c 程式,rev eng w/ Ghidra,pcaps)合作一個月左右導致了我最終在 doc.windows.com https://docs.microsoft.com/en-上分享的內容我們/answers/questions/372996/working-sample-of-ldap-usersmimecertificate-attrib.html。因此,對於那些在同一個問題上苦苦掙扎的人,我希望這會有所幫助,並且很高興在這裡重新發布全文。
這是 PKCS7 簽名的消息。在 .Net 中,您可以使用 SignedCMS 對象
... using System.Security.Cryptography.Pkcs; ... var ctx = new System.DirectoryServices.AccountManagement.PrincipalContext(System.DirectoryServices.AccountManagement.ContextType.Domain); var userPrincipal = System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(ctx, System.DirectoryServices.AccountManagement.IdentityType.SamAccountName, "...account..."); var adObject= userPrincipal.GetUnderlyingObject() as System.DirectoryServices.DirectoryEntry; var sm = adObject.Properties["userSMIMECertificate"] as byte[]; var sCMS = new SignedCms(); sCMS.Decode(smc);
ContentType 的類型為 1.2.840.113549.1.7.1(“PKCS 7 數據”)。
就我而言,它不是空的,而是包含 45 6d 70 74 79 20 42 6f 64 79
《空虛的身體》
如果只需要該對象的證書,可以使用 X509Certificate2Collection 的導入功能
var col = new System.Security.Cryptography.X509Certificates.X509Certificate2Collection(); col.Import((byte[])smc);
創建這個 userSMIMECertificate 對像有一個問題:您需要訪問私鑰。因此,可以創建對象的將是使用者本身,或智能卡管理系統(發行時有卡)。
不必使用“userSMIMECertificate”,而只使用“userCertificate”。後者是企業可管理的,使用兩者在不同時會產生衝突。它還取決於客戶端首先使用哪個。