Top > OOoBasic > Generic > DiditalSignature
* デジタル署名 [#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

}}

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes