デジタル署名 
デジタル署名。
Windows 環境ではインターネットオプションに登録された証明書が利用されます。(インターネットオプション - コンテンツ - 証明書)
また、そのほかの環境ではまず MOZILLA_CERTIFICATE_FOLDER 環境変数から検索されます。該当の環境変数が設定されていない場合には Thunderbird、Mozilla、Firefox の順に証明書が検索されます。(オプション - 詳細 - 暗号化)
OOoBasic/Generic/MozillaProfile を使用して検索されます。
証明書一覧の取得 
利用できる証明書を取得します。com.sun.star.xml.crypto.SecurityEnvironment サービスを使用して一覧を取得しますが、com.sun.star.xml.crypto.SEInitializer サービスから初期化する必要があります。
注: 事前に読み込みが必要・・・?
Windows 環境 
下記のメモ参照。
その他の環境 
初回初期化時には認証ダイアログが表示される可能性があります。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 
com.sun.star.security.DocumentDigitalSignatures サービス。
oDDS = CreateUnoService(_
"com.sun.star.security.DocumentDigitalSignatures")
ドキュメント署名の確認 
ドキュメントにサインされた署名の有効性を確認します。DocumentDigitalSignatures サービスの verifyDocumentContentSignatures メソッドを使用します。
ドキュメントのストレージはドキュメントが一度保存された状態で 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
|