Page History
...
Herunder vejledning til udviklingen i forskellige områder af Seal.java. I Seal.Java stiller helt overordnet følgende funktionalitet til rådighed:
- Generering af DGWS requests
- Omveksling af tokens
- Generering og validering af digitale XML signaturer.
- Kryptering og dekryptering af XML dokumenter.
Generel forståelse
Det kan være en ide at læse følgende side der giver en generel forståelse af anvendelse og omveksling af adgangsbilletter:
Anvendelsen af OIOIDWS i nationale tjenester på sundhedsområdet
Signering og validering af digitale XML signaturer
Definition af en digital signatur er følgende:
A value computed with a cryptographic algorithm and appended to a data object in such a way that any recipient of the data can use the signature to verify the data's origin and integrity.
Eksempel på en digital signatur. Vi vil gerne signerer dette simple XML dokument:
| Code Block | ||||
|---|---|---|---|---|
| ||||
<?xml version="1.0" encoding="UTF-8" ?><person xmlns="http://www.sosi.dk/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<fornavn id="elmtosign"><value>Hans</value></fornavn>
<efternavn><value>Hansen</value></efternavn>
</person> |
Når det skal signeres skal man medsende en konfiguration der angiver hvilken del af dokumentet der skal signeres og i dette tilfælde er det elemetet med attributten "id=elemtosign".
Efter signering ser dokumentet således ud (bemærk: signatur-værdien og certifikatet er beskåret af hensyn til læsbarheden):
| Code Block | ||||
|---|---|---|---|---|
| ||||
<?xml version="1.0" encoding="UTF-8"?>
<person xmlns="http://www.sosi.dk/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<fornavn id="elmtosign">
<value>Hans</value>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="OCESSignature">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#elmtosign">
<ds:Transforms>
<ds:Transform
Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>QW77ZSa8bItvTzJ6Mx3U0UuhCBo=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
LvPqO4dbw9UglyNnkaIKN4oKaYCzv/pqcfNRzPd8UdUYiyRKY3zkCMdDB9EsjOp7ZsVym/O2mODQs8V34JjCVBQVHfwsQv8Ku0v...
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIIGyzCCBP+gAwIBAgIUIp4rXilrr1cv616bbYPuFN68rIowQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoG...
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
</fornavn>
<efternavn>
<value>Hansen</value>
</efternavn>
</person> |
Signaturen kan man bryde op i følgende dele:
- <ds:Signature>: angiver at her starter den digitale signatur.
- <ds:SignedInfo>: indeholder følgende information
- <ds:CanonicalizationMethod>: hvilken kanoniseringsalgoritme er blevet brugt for at normalisere dokumentet før signering.
- <ds:SignatureMethod>: hvilken algoritme er brugt til generingen af signaturen.
- <ds:Reference>: hvilket element er blevet signeret.
- <ds:SignatureValue: indeholder den digitale signatur. Værdien kan verificeres vha. den public key der findes under <ds:KeyInfo>
- <ds:KeyInfo>: indeholder X.509 certifikat der kan bruges til at autentificere underskriveren og validere signaturen.
parametriserede tests
Vi bruger JUnit 4 til at teste i Seal.java og vil gerne kunne afvikle parameteriserede tests mod de funktioner, hvor afviklingen er uændret, men input er variabelt. Det har primært været et ønske ifm. introduktionen af nye OCES3 certifikater, hvor snitfladerne har været uændret, men input har været henholdsvis OCES2 og OCES3 certifikater.
...
Så følger en kort beskrivelse af de problemstillinger vi har haft ifm. oprettelsen af tests. Vi gennemgår de hjælpeklasser og beslutninger, som er lavet for at give et bedre overblik og en nemmere tilgang til at lave parametriseret tests - og til sidst et eksempel på brugen af hjælpeklasserne.
Introduktion til Parameterized tests
En parametriseret JUnit4 test klasse skal afvikles med org.junit.runners.Parameterized. Derfor angives annotation @RunWith(Parameterized.class) på klassen.
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
@RunWith(Parameterized.class)
public class SimpleVaultTest {
@Parameter(0)
public X509Certificate certificateToTest; //Skal være public!
@Parameter(1)
public String expectedCommonName;
@Parameter(2)
public String expectedSubjectSerialNumber;
@Parameters
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] {{ CredentialVaultTestUtil.getCredentialVault().getSystemCredentialPair().getCertificate(),
"TU GENEREL MOCES M CPR gyldig",
"CVR:30808460-RID:42634739"
}, { CredentialVaultTestUtil.getMoces3CredentialVault().getSystemCredentialPair().getCertificate(),
"Tonnis Vestergaard",
"UI:DK-153279bd-07cb-4128-a8b1-666107fba6d5"}});
}
@Test
public void testCertificateCommonName() {
DistinguishedName dn = new DistinguishedName(certificateToTest.getSubjectX500Principal());
assertEquals("Forventede noget helt andet her?", expectedCommonName, dn.getCommonName());
}
@Test
public void testCertificateSubjectSerialNumber() {
DistinguishedName dn = new DistinguishedName(certificateToTest.getSubjectX500Principal());
assertEquals("Forventede noget helt andet her?", expectedSubjectSerialNumber, dn.getSubjectSerialNumber());
}
} |
Hjælpeklasser til Parameterized tests i Seal.java
I forbindelse med implemeneteringen af parametriserede tests stødte vi nogle mindre udfordringer.
...