|
MOA-SP/SS |
MOA SP/SS-Anwendung
Die Module Signaturprüfung (SP) und Serversignatur (SS) sind als plattformunabhängige Module ausgelegt, die über ein
Webservice bzw. ein Java-API verwendet werden können.
|
|
|
Voraussetzungen
Die folgende Liste enthält die erforderlichen Java-Bibliotheken, um die Beispielprogramme auszuführen.
Die angeführten Versionsnummern bezeichnen jene Versionen dieser Java-Bibliotheken, mit denen die
Beispielprogramme getestet wurden.
|
|
|
Beispiel-Programme Im folgenden werden vier Beispiele für Client-Applikationen beschrieben:
|
|
|
Beispiel HTTPClientExample
1. Einlesen des XML-Request aus einer Datei
FileInputStream inputStream =
new FileInputStream("example_request.xml");
2. Aufbau der DOM-Struktur Erstellen der BuilderFactory für den Parser
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
Namespaces müssen im Request definiert sein, darum
factory.setNamespaceAware(true);
Einen neuen Builder instanzieren
DocumentBuilder builder =
factory.newDocumentBuilder();
XML-Datei einlesen und parsen
Document root_request =
builder.parse(inputStream);
3. AXIS Service instanzieren Service erstellen. SERVICE_QNAME ist entweder SignatureCreation oder SignatureVerification.
Service service =
ServiceFactory.newInstance().
createService(SERVICE_QNAME);
Call Object erstellen
Call call = service.createCall();
Ein SOAP Body Objekt erzeugen und mit dem Request aus der Datei füllen
SOAPBodyElement body =
new SOAPBodyElement(root_request.
getDocumentElement());
SOAPBodyElement[] params =
new SOAPBodyElement[] {body};
Serviceendpunkt einstellen. URL zum Server mit dem Webservice z.b. http://localhost:8080/moa-spss/services/SignatureCreation.
call.setTargetEndpointAddress(ENDPOINT);
4. Service aufrufen Request durchführen (Parameter werden als Array von SOAPBodyElement-Objekten übergeben)
Vector responses = (Vector)call.invoke(params);
Response auslesen
SOAPBodyElement response =
(SOAPBodyElement) responses.get(0);
Response-Document auslesen
Document root_response = response.getAsDocument();
5. Exceptions behandeln Folgende Exceptions können auftreten und müssen bei der Dokumentverarbeitung behandelt werden:
|
|
|
Beispiel HTTPSClientExampleServerAuth
Zusätzlich zu HTTPClientExample:
Erst werden die Konstanten für die Systemproperties gesetzt
handler = "java.protocol.handler.pkgs";
trustStore = "javax.net.ssl.trustStore";
trustStorePassword =
"javax.net.ssl.trustStorePassword";
Hinzufügen des SSL-Providers in das Systemobjekt Security
Security.addProvider(
new com.sun.net.ssl.internal.ssl.Provider());
Setzen der Systemproperties für den SSL-Provider
System.setProperty(
handler,"com.sun.net.ssl.internal.www.protocol");
System.setProperty(
trustStore, "client.keystore");
System.setProperty(trustStorePassword, "changeit");
Danach muß nur noch der Endpunkt umgestellt werden von ENDPOINT zu SECURE_ENDPOINT
"http://localhost:8080/moa-spss/
services/SignatureCreation"
wird zu
"https://localhost:8443/moa-spss/
services/SignatureCreation"
AXIS erkennt das es sich um eine sichere Verbindung handelt und initialisert die Verbindung über einen SecureSocket.
|
|
|
Beispiel HTTPSClientExampleClientAuth
Zusätzlich zu HTTPSClientExampleServerAuth:
Für Clientauthorisierung kommen noch folgende Properties hinzu
keyStore = "javax.net.ssl.keyStore";
keyStorePassword = "javax.net.ssl.keyStorePassword";
System.setProperty(
keyStore, "client.keystore");
System.setProperty(keyStorePassword, "changeit");
|
|
|
Beispiel APIClientExample
Folgende VM-Properties müssen gesetzt sein um das API Beispiel
ausführen zu können.
Serverfunktionshandler instanzieren SPSSFactory spf = SPSSFactory.getInstance();Signaturedaten in ein Contentobjekt einbinden byte[]data =
"Dies sind Testdaten".getBytes("UTF-8");
ByteArrayInputStream bis =
new ByteArrayInputStream(data);
Content cont =
spf.createContent(bis,"http://uri.data.org");
Beschreibungselement zu den Daten erstellen
MetaInfo mi =
spf.createMetaInfo("text/plain","Testdaten",null);
Transformationen erstellen
CreateTransformsInfo cti = spf.createCreateTransformsInfo(null,mi); CreateTransformsInfoProfile ct = spf.createCreateTransformsInfoProfile( cti, null);Datenobjekt aufbauen DataObjectInfo doi = spf.createDataObjectInfo( DataObjectInfo.STRUCTURE_DETACHED, false, cont, ct); List dataobjectinfolist = new ArrayList(); dataobjectinfolist.add(doi);alles zusammenpacken zu einer SingleSignature SingleSignatureInfo ssi = spf.createSingleSignatureInfo( dataobjectinfolist, null, false); List singlesignatureinfolist = new ArrayList(); singlesignatureinfolist.add(ssi);die Signatur in einen Request einbetten CreateXMLSignatureRequest cxsreq = spf.createCreateXMLSignatureRequest( "PKCS12RSAKey1", singlesignatureinfolist);Signatureerstellungsservice instanzieren SignatureCreationService scs = SignatureCreationService.getInstance();Signatureerstellungsservice aufrufen CreateXMLSignatureResponse cxsres = scs.createXMLSignature(cxsreq);Response auswerten List elements = cxsres.getResponseElements(); SignatureEnvironmentResponse ser = (SignatureEnvironmentResponse)elements.get(0);Responsetyp lesen int response_type = ser.getResponseType();
if(response_type ==
SignatureEnvironmentResponse.ERROR_RESPONSE)
{
...
}
Fehlerfall
System.out.println("Bei der Erstellung der
Signatur ist ein Fehler aufgetreten");
Signaturerstellung erfolgreich
Element se = ser.getSignatureEnvironment(); System.out.println( "Signaturerstellung erfolgreich"); displayTree(se); | ||||||||
|
|
Beispiel-Requests
In den folgenden Abschnitten werden einfache und umfassende Beispiele für Requests beschrieben, die an MOA-SP/SS
gesendet werden können. Damit soll der Anwendungsentwickler einen Überblick über die
Möglichkeiten von MOA-SP/SS vermittelt bekommen. Die detaillierte und vollständige Beschreibung
des Funktionsumfangs ist in den Spezifikationen von MOA-SP/SS und des Security-Layers enthalten.
|
|
|
Beispiel:
Das Beispiel in CreateXMLSignatureReqest1.xml zeigt einen
einfachen <CreateXMLSignatureRequest>. Die Bedeutung der einzelnen Elemente
wird im folgenden beschrieben:
<KeyIdentifier>PKCS12RSAKey1</KeyIdentifier>PKCS12RSAKey1 bezeichnet eine Schlüsselgruppe aus der MOA-SS einen Signaturschlüssel selektieren soll und muss einer im Konfigurationsfile definierten <KeyGroup> entsprechen. <SingleSignatureInfo SecurityLayerConformity="false">Für jedes <SingleSignatureInfo>-Element wird eine eigene XML-Signatur erzeugt. Wird das Attribut SecurityLayerConformity auf true gesetzt, dann wird eine XML-Signatur gemäß Security-Layer Spezifikation erzeugt; d.h. es werden signierte Properties (Zeitpunkt der Signaturerstellung, das für die Signaturüberprüfung zu verwendende Zertifikat, Metainformationen zu den signierten Datenobjekten) und ein Manifest, das alle implizite Transformationsparameter enthält, zur Signatur hinzugefügt.
<DataObjectInfo Structure="enveloping">
Für jedes Daten-Objekt, das in die Signatur als dsig:Reference aufgenommen werden soll, muss ein
DataObjectInfo-Element spezifiziert werden. Das Attribut Structure gibt an, ob die Daten
in die Signatur in ein <dsig:Object>-Element integriert werden soll
(Structure="enveloping") oder via eine URL referenziert werden soll (Structure="detached").
Im Fall von Structure="enveloping" muss im nachfolgenden DataObject Element entweder das Attribut Reference gesetzt sein oder die zu signierenden Daten explizit im Element Base64Content oder XMLContent spezifiziert sein. Die Angabe der zu signierenden Daten über das Attribut Reference und gleichzeitig dem Element Base64Content oder XMLContent ist nicht erlaubt. Im Fall von Structure="detached" muss das Attribut Reference im nachfolgenden DataObject Element gesetzt sein. Die Angabe der Elemente Base64Content oder XMLContent ist optional.
<DataObject>
<XMLContent xml:space="preserve">
Diese Daten werden signiert.
<XMLContent>
</DataObject>
Die zu signierenden Daten werden im Element <DataObject> spezifiziert und können entweder als
<XMLContent> oder <Base64Content> oder über das Attribut Reference
angegeben werden.
<CreateTransformsInfoProfile>
<CreateTransformsInfo>
<FinalDataMetaInfo>
<MimeType>text/plain<MimeType>
</FinalDataMetaInfo>
</CreateTransformsInfo>
</CreateTransformsInfoProfile>
Zu jedem Daten-Objekt können optional Transformationen (z.B. XPath, XSLT, Base64-Decodierung, etc.)angegeben werden.
Werden keine Transformationen angegeben so muss zumindest der MIME-Type der zu signierenden Daten spezifiziert werden.
Die von diesem Request erzeugt Response ist in CreateXMLSignatureResponse1.xml abgelegt. |
|
|
Beispiel:
Die oben erzeugte XML-Signatur kann mit dem in VerifyXMLSignatureReqest1.xml gezeigten
einfachen <VerifyXMLSignatureRequest> wieder überprüft werden.
<VerifyXMLSignatureRequest
xmlns="http://reference.e-government.gv.at/
namespace/moa/20020822#"
xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
<VerifySignatureInfo>
<VerifySignatureEnvironment>
<XMLContent>
<dsig:Signature
Id="signature-1"
xmlns:dsig="http://www.w3.org/2000/09/
xmldsig#">
.........
</dsig:Signature>
</XMLContent>
</VerifySignatureEnvironment>
Im Element VerifySignatureInfo wird zuerst die zu überprüfende Signatur im Element
VerifySignatureEnvironment angegeben. Im Beispiel wird die Signatur als Kind-Element von
<XMLContent> spezifiziert. Alternativ könnte die Signatur in Base64-Kodierung
im Element <Base64Content> oder mit dem Attribut Reference über eine URL
referenziert werden.
<VerifySignatureLocation>
//dsig:Signature
</VerifySignatureLocation>
</VerifySignatureInfo>
Weiters muss mittels eines XPath-Ausdrucks im Element <VerifySignatureLocation>
die Position der zu prüfenden Signatur spezifiziert werden. Werden im XPath-Ausdruck
Namespace-Prefixes verwendet, müssen die entsprechenden Namespace-Deklarationen im Kontext
des Elements VerifySignatureLocation bekannt sein. Im Beispiel wird das Prefix dsig
verwendet, das im Element <VerifyXMLSignatureRequest> deklariert wird.
<TrustProfileID>TrustProfile1<TrustProfileID>Abschließend wird im Element <TrustProfileID> ein Trustprofile spezifiziert, das am MOA-SP Server definiert ist und jene Zertifikate enthält, die für diesen Request als vertrauenswürdig gelten. Die von diesem Request erzeugt Response ist in VerifyXMLSignatureResponse1.xml abgelegt. Die Response enthält das Ergebnis der Signaturprüfung im Element <SignatureCheck>, das Ergebnis der Zertifikatsprüfung im Element <CertificateCheck> und Informationen über den Signator im Element <SignerInfo>/<X509Data>. Die Informationen über den Signator bestehen aus den Elementen <X509SubjectName>, <X509IssuerSerial> und <X509Certificate>. |
|
|
Beispiel:
Das Beispiel in
VerifyXMLSignatureReqest2.xml zeigt wie die im obigen Beispiel erzeugte zweite Signatur
überprüft werden kann.
<VerifyXMLSignatureRequest
xmlns="http://reference.e-government.gv.at/
namespace/moa/20020822#"
xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
<DateTime>2003-03-24T12:41:54+01:00</DateTime>
Optional kann ein Datum und eine Uhrzeit angegeben werden, für die die Überprüfung durchgeführt werden soll.
<VerifySignatureInfo>
<VerifySignatureEnvironment>
<XMLContent>
<env:Document xmlns:env="http://uri.env.org" .....>
nach diesem Text ..... Dokument eingefuegt
<dsig:Signature .....>.....</dsig:Signature>
</env:Document>
</XMLContent>
</VerifySignatureEnvironment>
Die Signatur inklusive des umgebenden XML-Dokuments wird im Element <VerifySignatureEnvironment>
angegeben.
<VerifySignatureLocation>
//dsig:Signature
</VerifySignatureLocation>
</VerifySignatureInfo>
Die zu prüfende Signatur aus dem Element <VerifySignatureEnvironment> wird über einen XPath-Ausdruck
spezifiziert.
Enthält die Signatur ID-Attribute, die referenziert werden, dann muss das XML-Dokument validierend geparst werden können.
Im Beispiel-Request wird die URL des Schemas für das Element env:Document im Attribut xsi:schemaLocation
spezifiziert (http://anyhost/envSchema.xsd). Soll MOA-SP diese URL nicht selbst auflösen, dann kann das
Schema kann im Element SupplementProfile übergeben werden:
<SupplementProfile>
<Content Reference="http://anyhost/envSchema.xsd">
<XMLContent xml:space="preserve">
<xsd:schema
targetNamespace="http://uri.env.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsd:element name="Document">
<xsd:complexType mixed="true">
<xsd:sequence minOccurs="0"
maxOccurs="unbounded">
<xsd:any namespace="##any"
processContents="lax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</XMLContent>
</Content>
</SupplementProfile>
<ReturnHashInputData/>Das Element gibt an, dass für jedes dsig:SignedInfo/dsig:Reference Element jene Daten, die für die Hash-Berechnung der Signatur als Eingangsdaten verwendet werden, in der Antwort returniert werden sollen. <TrustProfileID>TrustProfile1</TrustProfileID> </VerifyXMLSignatureRequest>Abschließend wird ein am MOA-SP Server definiertes Profil angegeben, dass jene Zertifikate umfasst, die für diesen Request als vertrauenswürdig anzusehen sind. Die von diesem Request erzeugt Response ist in VerifyXMLSignatureResponse2.xml abgelegt. Zusätzlich zu den Daten der Response des einfachen VerifyXMLSignatureRequests enthält diese Response für jedes dsig:SignedInfo/dsig:Reference Element ein HashInputData Element. |
|
|
Beispiel:
Das Beispiel in VerifyCMSSignatureRequest.xml zeigt einen
einfachen <VerifyCMSSignatureRequest>. Die Bedeutung der einzelnen Elemente
wird im folgenden beschrieben:
<VerifyCMSSignatureRequest
xmlns="http://reference.e-government.gv.at/
namespace/moa/20020822#"
xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"
Signatories="1">
Das optionale Attribut Signatories enthält eine Liste von positiven Ganzzahlen und gibt an, welche Signaturen
im CMS-Datenobjekt überprüft werden sollen. Signatories="1" gibt an, dass die erste Signatur geprüft
werden soll.
Wird das Attribut nicht spezifiziert, dann wird ebenfalls die erste Signatur geprüft. Signatories="all"
gibt an, dass alle im CMS-Objekt enthaltene Signaturen geprüft werden sollen.
<DateTime>2003-04-04T09:30:47-05:00</DateTime>Das optionale Element <DateTime> gibt an für welchen Zeitpunkt die Signaturüberprüfung durchgeführt werden soll. Ist das Element nicht im Request enthalten, dann wird die aktuelle Systemzeit verwendet. <CMSSignature>MIIGAAYJKo...mT9fmvKwdJOiA==</CMSSignature>Das Element <CMSSignature> enthält das CMS-Signaturobjekt in Base64-Kodierung. Sind die signierten Daten nicht in der CMS-Signatur enthalten, müssen sie im DataObject-Element angegeben werden. Optional kann der MIME-Type dieser Daten spezifiziert werden. Die eigentlichen Daten müssen im Base64Content-Element in Base64-Kodierung vorliegen. <TrustProfileID>TrustProfile1<TrustProfileID>TrustProfile1 referenziert ein im Konfigurationsfile des MOA-Server definiertes Profil, das jene Zertifikate umfasst, die für diese Überprüfung als vertrauenswürdig gelten. Die von diesem Request erzeugt Response ist in VerifyCMSSignatureResponse.xml abgelegt. Die Response enthält die selben Informationen wie die Response zum einfachen VerifyXMLSignatureRequest. |
|
© 2003
|