Top > OOoBasic > Generic > DiditalSignature

デジタル署名 Edit

デジタル署名。

Windows 環境ではインターネットオプションに登録された証明書が利用されます。(インターネットオプション - コンテンツ - 証明書)

また、そのほかの環境ではまず MOZILLA_CERTIFICATE_FOLDER 環境変数から検索されます。該当の環境変数が設定されていない場合には Thunderbird、Mozilla、Firefox の順に証明書が検索されます。(オプション - 詳細 - 暗号化) OOoBasic/Generic/MozillaProfile を使用して検索されます。

証明書一覧の取得 Edit

利用できる証明書を取得します。com.sun.star.xml.crypto.SecurityEnvironment サービスを使用して一覧を取得しますが、com.sun.star.xml.crypto.SEInitializer サービスから初期化する必要があります。

注: 事前に読み込みが必要・・・?

Windows 環境 Edit

下記のメモ参照。

その他の環境 Edit

初回初期化時には認証ダイアログが表示される可能性があります。SEInitializer サービスから createSecurityContext メソッドの引数に Thunderbird, Mozilla, Firefox のプロファイルのパスを指定します。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
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 Edit

com.sun.star.security.DocumentDigitalSignatures サービス。

  oDDS = CreateUnoService(_
   "com.sun.star.security.DocumentDigitalSignatures")

ドキュメント署名の確認 Edit

ドキュメントにサインされた署名の有効性を確認します。DocumentDigitalSignatures サービスの verifyDocumentContentSignatures メソッドを使用します。

[]com.sun.star.security.DocumentSignatureInformation
verifyDocumentContentSignatures( com.sun.star.embed.XStorage xStorage,
                                   [in] com.sun.star.io.XInputStream xSignInStream )
declared in: com.sun.star.security.XDocumentSignatureInformation

ドキュメントコンテンツに対する全ての署名の有効性を調べます。

xStorage
確認する署名されたドキュメントのストレージ
xSignInStream
デジタル署名のファイルストリーム
返り値
&idlref(com.sun.star.security.DocumentSignatureInformation);

ドキュメントのストレージはドキュメントが一度保存された状態で com.sun.star.document.XStorageBasedDocument インターフェースの getDocumentStorage メソッドを使用して取得します。または、開いていないドキュメントのファイルストレージも利用できるかもしれません。

xSignInStream はドキュメントのストレージから META-INF/documentsignature.xml ファイルの com.sun.star.io.XInputStream を取得します。

たとえば、下記の様にします。(AOO 3.4 付近ではストレージを開くときに更に引数を与える必要があります。二番目のコード参照)

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
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 付近以降

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
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