* デジタル署名 [#lcd3f064] デジタル署名。 Windows 環境ではインターネットオプションに登録された証明書が利用されます。(インターネットオプション - コンテンツ - 証明書) また、そのほかの環境ではまず MOZILLA_CERTIFICATE_FOLDER 環境変数から検索されます。該当の環境変数が設定されていない場合には Thunderbird、Mozilla、Firefox の順に証明書が検索されます。(オプション - 詳細 - 暗号化) [[OOoBasic/Generic/MozillaProfile]] を使用して検索されます。 #contents ** 証明書一覧の取得 [#t6f866ee] 利用できる証明書を取得します。com.sun.star.xml.crypto.SecurityEnvironment サービスを使用して一覧を取得しますが、com.sun.star.xml.crypto.SEInitializer サービスから初期化する必要があります。 注: 事前に読み込みが必要・・・? *** Windows 環境 [#m6aa3711] 下記のメモ参照。 *** その他の環境 [#jc6c7071] 初回初期化時には認証ダイアログが表示される可能性があります。SEInitializer サービスから createSecurityContext メソッドの引数に Thunderbird, Mozilla, Firefox のプロファイルのパスを指定します。 #code(basic){{ Sub digitalsignature_1 oMoz = CreateUnoService(_ "com.sun.star.mozilla.MozillaBootstrap") nTYpe = com.sun.star.mozilla.MozillaProductType sDefault = oMoz.getDefaultProfile(_ nType.Firefox) sCertDB = oMoz.getProfilePath(nType.Firefox, sDefault) oSEInit = CreateUnoService( _ "com.sun.star.xml.crypto.SEInitializer") oXMLSC = oSEInit.createSecurityContext(sCertDB) If oXMLSC.getSecurityEnvironmentNumber() < 0 Then Exit Sub oSEnv = oXMLSC.getSecurityEnvironment() oCertificates = oSEnv.getPersonalCertificates() oSEInit.freeSecurityContext(oXMLSC) oXMLSC = nothing oSEnv = nothing oSEInit = nothing oXMLSig = nothing oXMLEnc = nothing end sub }} ** DocumentDigitalSignatures [#td3cd117] com.sun.star.security.DocumentDigitalSignatures サービス。 oDDS = CreateUnoService(_ "com.sun.star.security.DocumentDigitalSignatures") *** ドキュメント署名の確認 [#k14fbb7d] ドキュメントにサインされた署名の有効性を確認します。DocumentDigitalSignatures サービスの verifyDocumentContentSignatures メソッドを使用します。 #method{{ []com.sun.star.security.DocumentSignatureInformation verifyDocumentContentSignatures com.sun.star.embed.XStorage xStorage, [in] com.sun.star.io.XInputStream xSignInStream com.sun.star.security.XDocumentSignatureInformation ドキュメントコンテンツに対する全ての署名の有効性を調べます。 :xStorage|確認する署名されたドキュメントのストレージ :xSignInStream|デジタル署名のファイルストリーム :返り値|&idlref(com.sun.star.security.DocumentSignatureInformation); }} ドキュメントのストレージはドキュメントが一度保存された状態で &idlref(com.sun.star.document.XStorageBasedDocument); インターフェースの getDocumentStorage メソッドを使用して取得します。または、開いていないドキュメントのファイルストレージも利用できるかもしれません。 xSignInStream はドキュメントのストレージから META-INF/documentsignature.xml ファイルの &idlref(com.sun.star.io.XInputStream); を取得します。 たとえば、下記の様にします。(AOO 3.4 付近ではストレージを開くときに更に引数を与える必要があります。二番目のコード参照) #code(ob){{ Sub signature_1 ' verify test Dim oDoc As Object oDoc = ThisComponent msgbox verifyAllDocumentContentSignatures(oDoc) End Sub Function verifyAllDocumentContentSignatures( oDoc As Object ) As Long ' verify all Document content signatures ' Arguments: ' oDoc: Document Model ' Return: ' 0: invalid ' 1: valid all ' 2: faild to verify, unable to get its storage ' 4: faild to verify, there is no document signature Dim nValid As Long nValid = 2 Dim oDocStorage As Object, oSignatureStream As Object Dim oDDS As Object Dim aInfos As Object Dim i As Integer ' open document storage If HasUnoInterfaces( _ oDoc, "com.sun.star.document.XStorageBasedDocument") Then oDocStorage = oDoc.getDocumentStorage() ' get document signature oSignatureStream = GetDocumentContentSignature(oDocStorage) If NOT IsNull(oSignatureStream) Then oDDS = CreateUnoService(_ "com.sun.star.security.DocumentDigitalSignatures") ' get information about signatures aInfos = oDDS.verifyDocumentContentSignatures( _ oDocStorage, oSignatureStream) If UBound(aInfos) >= 0 Then For i = 0 To UBound(aInfos) step 1 If NOT aInfos(i).SignatureIsValid Then nValid = 0 Exit For End If Next If nValid <> 0 Then nValid = 1 Else nValid = 4 End If Else nValid = 4 End If End If verifyAllDocumentContentSignatures = nValid End Function Function GetDocumentContentSignature( oDocStorage As Object ) As Object ' get signature file stream Dim oSignatureStream As Object Dim oSubStorage As Object Dim sMETAINF As String, sSignatureName As String Dim nMode As Long sMETAINF = "META-INF" sSignatureName = "documentsignatures.xml" If oDocStorage.hasByName(sMETAINF) Then nMode = com.sun.star.embed.ElementModes.READ oSubStorage = oDocStorage.openStorageElement(sMETAINF, nMode) If oSubStorage.hasByName(sSignatureName) Then oSignatureStream = _ oSubStorage.openStreamElement(sSignatureName, nMode) End If End If GetDocumentContentSignature = oSignatureStream End Function }} AOO 3.4 付近以降 #code(ob){{ Sub signature_3 sFileURL = "file:///home/asuka/Downloads/valid_ooo3_2_doc1.odt" Dim aProps(0) as new com.sun.star.beans.PropertyValue aProps(0).Name = "StorageFormat" aProps(0).Value = "ZipFormat" sf = CreateUnoService("com.sun.star.embed.StorageFactory") oDocStorage = sf.createInstanceWithArguments(array(sFileURL, 1, aProps)) if oDocStorage.hasByName("META-INF") Then metainf = oDocStorage.openStorageElement("META-INF", 3) if metainf.hasByName("documentsignatures.xml") Then signio = metainf.openStreamElement("documentsignatures.xml", 3) oDDS = CreateUnoServiceWithArguments("com.sun.star.security.DocumentDigitalSignatures", _ Array("1.2", True)) aInfos = oDDS.verifyDocumentContentSignatures(oDocStorage, signio) If UBound(aInfos) >= 0 Then For i = 0 To UBound(aInfos) step 1 msgbox "SignatureIsValid: " & CStr(aInfos(i).SignatureIsValid) ' oSigner = aInfos(i).Signer next End If End If End if End Sub } *** 証明書の表示 [#id259dc2] 証明書を表示します。 oCertificate = oCertificates(0) oDDS.showCertificate(oCertificate) ** メモ [#a1c0afc9] Windows でデジタル署名一覧を取得する。com.sun.star.xml.crypto.SEInitializer サービスから以下の様にして createSecurityContext メソッドの引数には "My" などを指定する。 内部で以下の関数が呼ばれているため、下記のものが使用可能。CA, MY, ROOT, SPA。 - http://msdn.microsoft.com/en-us/library/aa376560(VS.85).aspx 注: 以下のコードでは freeSecurityContext メソッドでクリアしているにもかかわらずクラッシュします。原因不明。 Sub digitalsignature_1 sCertDB = "MY" 'oXMLSC = CreateUnoService( _ ' "com.sun.star.xml.crypto.XMLSecurityContext") 'oXMLSC.addSecurityEnvironment(oSEnv) oXMLSig = CreateUnoService(_ "com.sun.star.xml.crypto.XMLSignature") oXMLEnc = CreateUnoService(_ "com.sun.star.xml.crypto.XMLEncryption") oSEInit = CreateUnoService( _ "com.sun.star.xml.crypto.SEInitializer") oXMLSC = oSEInit.createSecurityContext(sCertDB) If oXMLSC.getSecurityEnvironmentNumber() < 0 Then Exit Sub oSEnv = oXMLSC.getSecurityEnvironment() oCertificates = oSEnv.getPersonalCertificates() 'mri oXMLSC oSEInit.freeSecurityContext(oXMLSC) oXMLSC = nothing oSEnv = nothing oSEInit = nothing oXMLSig = nothing oXMLEnc = nothing end sub ** メモ2 [#df5e61bd] デジタル署名が付与されたドキュメントの META-INF/ 以下には次のようなファイルが作成されます。 - documentsignatures.xml - macrosignatures.xml - packagesignatures.xml }} |