SignServer kasutamine WildFly v. 10 rakendusserveriga

Allikas: Imre kasutab arvutit

Sissejuhatus

Ajatembeldus (ingl. k. Timestamping) võimaldab moodustada tekstile vastava räsi ja seostada selle arvutamise ajahetkega. Tulemusena saab suvalisel hilisemal ajal veenduda, et kõnealune tekst on eksisteerinud alates ajatembelduse hetkest. Nt leiab ajatembeldus kasutust ID kaardiga digitaalse allkirjastamise juures (http://www.id.ee/?id=35892), samuti võetakse X-tee v. 6 logidele peale ajatempel.

Tööpõhimõte

SignServer CE (Community Edition) on WildFly rakenduskeskkonnas töötav Java rakendus, tekst on moodustatud v. 3.7.0 kogemuse alusel. SignServer omakorda koosneb moodulitest (nt PDF signer, TSA).

  • kasutaja:grupp - wildfly:wildfly - kõik WildFly ja SignServer rakendustega seotud faili ja protsesssid on selle kasutaja:grupp omad
  • /opt/wildfly - symlink -> /opt/wildfly-10.0.0.Final
  • /opt/signserver - symlink -> /opt/signserver-3.7.0 - siit kataloogist rakendus ei tööta, siis asuvad SignServer seadistusfailid, sertifikaadid jms
  • kõneksolev server tegeleb vaid SignServer TSA teenuse pakkumisega

Esmalt käivitatakse PostgreSQL andmebaas ja WildFly java rakendusserver kõige tavalisemal viisil, seejärel kompileeritakse SignServer ja deploitakse WildFly kõhu alla.

Teenuse kasutamise võrguskeem võiks olla nt selline

   internet

     |
   __|__
  |     | tulemüür
  |_____|
     |
     |
   --|----|---------------------|-----
          |                     |
        __|__                 __|__
       |     |               |     |
       |_____|               |_____|
      
    http koormusjaotur       wildfly
       nginx

kus

Ettevalmistused

Operatsioonisüsteemi ja WildFly rakendusserveri ettevalmistamist kirjeldatakse tekstis Java rakendusserver WildFly. SignServer paigaldamise eelduseks on

  • operatsioonisüsteem Ubuntu 16.04
  • OpenJDK v. 8
  • PostgreSQL andmebaas v. 9.4 (PGDG repost, UTF-8 ja en_US.UTF-8)
  • WildFly v. 10 java rakendusserver, kus on kirjeldatud PostgreSQL baasi data source

Andmebaasi ettevalmistamine

Eelduseks on, et süsteemi on paigaldatud või on muidu kasutada PostgreSQL v. 9.4 andmebaas, mida saab UTF8 kodeeringus kasutada. Seejärel tuleb moodustada signserver jaoks kasutaja ning create database andmebaas

# su - postgres
$ psql
postgres=# create role signserver login password 'signserver' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE;
postgres=# create database signserver owner = signserver;

Java rakendusserver kasutab baasi JDBC draiveriga, mille saab kopeerida aadressilt https://jdbc.postgresql.org/download.html, vasvalt Java ja PostgreSQL versioonile, nt

# cd /tmp
# wget https://jdbc.postgresql.org/download/postgresql-9.4.1208.jar

WildFly juurde draiveri paigaldamiseks peab WildFly protsess töötama ja sobib öelda

[standalone@localhost:9990 /] module add --name=org.postgresql --resources=/tmp/postgresql-9.4.1208.jar --dependencies=javax.api,javax.transaction.api

tulemusena tekib failisüsteemi

/opt/wildfly/modules/org/postgresql/main/postgresql-9.4.1208.jar
/opt/wildfly/modules/org/postgresql/main/module.xml

Seejärel öelda

[standalone@localhost:9990 /] /subsystem=datasources/jdbc-driver=postgresql:add(driver-name="postgresql",driver-module-name="org.postgresql",driver-class-name=org.postgresql.Driver)

ja lõpuks registreerida data source

[standalone@localhost:9990 /] data-source add --name=SignServerDS --driver-name="postgresql" --connection-url="jdbc:postgresql://127.0.0.1/signserver" --jndi-name="java:/SignServerDS" --use-ccm=true --user-name="signserver" --password="signserver" --validate-on-match=true --background-validation=false --prepared-statements-cache-size=50 --share-prepared-statements=true --min-pool-size=5 --max-pool-size=150 --pool-prefill=true --transaction-isolation=TRANSACTION_READ_COMMITTED --check-valid-connection-sql="select 1"

kus

  • tundub, et name väärtuses on oluline jälgida tõstutundlikkust (signserverds vs SignServerDS)

Testimiseks

[standalone@localhost:9990 /] /subsystem=datasources/data-source=SignServerDS:test-connection-in-pool
{
    "outcome" => "success",
    "result" => [true]
}

Andmebaasi initsialiseerib SignServer rakendus esmakordsel käivitamisel.

SignServer tarkvara paigaldamine ja käivitamine

Enne SignServeriga tegelemist tuleb käivitada WildFly nagu ikka, aga lisaks kasutada keskkonnamuutujat (see on vajalik rakenduse töötamiseks)

$ export SIGNSERVER_NODEID=DEV_TSA1

Sobiv on see lisada faili /opt/wildfly-home/.profile

$ tail -n 1 .profile                                             
export SIGNSERVER_NODEID=DEV_TSA1

Kopeerida http://signserver.org/ veebikoha paigaldusjuhendis viidatud aadressilt https://www.signserver.org/download.html source + teeke sisadav arhiiv, kus sisaldab tarkvara lähtetekst ja lisaks vajalikud teegid (nb! lisaks jagatakse ka puhast lähteteksti ja puhast binary)

# cd /opt/wildfly-home/tarkvara
# wget "https://sourceforge.net/projects/signserver/files/signserver/3.7/signserver-ce-3.7.0.zip/download" -O signserver-ce-3.7.0.zip 

Pakkida lahti

# cd /opt
# unzip /opt/wildfly-home/tarkvara/signserver-ce-3.7.0.zip
# chown -R wildfly:wildfly /opt/signserver-ce-3.7.0

moodustada link

# ln -s /opt/signserver-ce-3.7.0 /opt/signserver

Lisada wildfly .profile faili samuti keskkonnamuutujad (need on vajalikud kompileerimiseks)

export APPSRV_HOME=/opt/wildfly
export ANT_OPTS="-Xmx512m"
export SIGNSERVER_HOME=/opt/signserver

ning logida uuesti sisse wildfly kasutajaga, et .profile kehtestuks

Seadistada properties kompileerimiseks (tundub, et reaalselt kasutatakse vaid jndi abil viidatud ressurssi)

$ cd /opt/signserver
$ egrep -v "^#|^$" conf/signserver_deploy.properties
j2ee.web-nohttps=false
datasource.jndi-name=SignServerDS
datasource.jndi-name-prefix=java:/
database.name=postgres
database.url=jdbc:postgresql://127.0.0.1/signserver
database.username=signserver
database.password=signserver
signserverws.enabled=true
genericws.enabled=false
validationws.enabled=false
adminws.enabled=false
clientws.enabled=false
includemodulesinbuild=false
module.log4j.enabled=true
module.tsa.enabled=true
timestampclient.enabled=true
healthcheck.authorizedips=127.0.0.1;::1;0:0:0:0:0:0:0:1;194.204.62.115
validationclient.enabled=false
signingandvalidationapi.enabled=false

kus

  • enamuse *ws teenuseid on välja kommenteeritud
  • enamus module.* mooduleid on välja kommenteeritud

Kompileerida ja deploida

$ bin/ant clean build deploy
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
..

    [echo] Configured EAR file available at: /opt/signserver/tmp/signserver.ear
    [echo] 
    [echo] Deploying /opt/signserver/tmp/signserver.ear to /opt/signserver/standalone/deployments
    [echo] 
    [echo] Task completed 2016-06-29 23:23:01 +0300.

BUILD SUCCESSFUL
Total time: 6 minutes 35 seconds

mille tulemusena WildFLy saab automaatselt aru lisandunud rakendusest, JBoss logisse tekib midagi sellist

..
23:25:04,373 INFO  [org.jboss.web] (MSC service thread 1-3) JBAS018210: Registering web context: /signserver
23:25:04,376 INFO  [org.jboss.as] (MSC service thread 1-1) JBAS015951: Admin console listening on http://127.0.0.1:9990
23:25:04,377 INFO  [org.jboss.as] (MSC service thread 1-1) JBAS015874: JBoss AS 7.1.1.Final "Brontes" started in 11601ms
  - Started 844 of 939 services (94 services are passive or on-demand)
23:25:04,436 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018559: Deployed "signserver.ear"

kus

  • tekib neli sarnast teadet, aga tundub, et need ei sega TSA töötamist
2016-07-07 17:52:16,807 WARN  [org.jboss.as.server.deployment] (MSC service thread 1-1) WFLYSRV0059: 
  Class Path entry xml-apis.jar in /content/signserver.ear/lib/serializer-2.7.2.jar  does not point to a valid jar for a Class-Path reference.

ja esmakordsel käivitamisel initsialiseeritakse automaatselt andmebaas ja asutakse seda kasutama

signserver=# \dt public.*
               List of relations
 Schema |       Name       | Type  |   Owner    
--------+------------------+-------+------------
 public | archivedata      | table | signserver
 public | auditrecorddata  | table | signserver
 public | globalconfigdata | table | signserver
 public | keyusagecounter  | table | signserver
 public | signerconfigdata | table | signserver
(5 rows)

Signserver kasutajaliidesed

  • CLI
$ bin/signserver utiliit
  • Web

Signserver-1.gif

Järjekordseks kompileerimiseks ja paigaldamiseks tuleb esmalt WildFly peal öelda rakendusele undeploy

[standalone@localhost:9990 /] undeploy signserver.ear

ja kustutada baas ning moodustada uuesti

# drop database signserver;
# create database signserver owner = signserver;

Self-signed TSA võtme-sertifikaadi moodustamine

Self-signed võtme-sertifikaadi tekitamiseks sobib öelda

$ openssl req -nodes -sha256 -new -keyout tsa-test.moraal.ee.key -newkey rsa:2048 > tsa-test.moraal.ee.csr

openssl kasutab täiendavat seadistusfaili

$ cat imre-tmp/myconfig.cnf 
[mysection]
extendedKeyUsage = "critical,timeStamping"
$ openssl x509 -extensions mysection -extfile myconfig.cnf -req -days 3650 -in tsa-test.moraal.ee.csr\
  -signkey tsa-test.moraal.ee.key -out tsa-moraal.ee.crt
Signature ok
subject=/C=EE/ST=Harjumaa/L=Tallinn/O=Moraal/CN=tsa-test.moraal.ee
Getting Private key
$ cat tsa-test.moraal.ee.key tsa-test.moraal.ee.crt > tsa-test.moraal.ee.sisend-p12
$ openssl pkcs12 -name "DEV_P12" -export -in tsa-test.moraal.ee.sisend-p12 -out tsa-test.moraal.ee.p12
$ keytool -v -list -storetype pkcs12 -keystore p12/tsa-test.moraal.ee.p12
Enter keystore password:  

Keystore type: PKCS12
Keystore provider: SunJSSE

Your keystore contains 1 entry

Alias name: dev_p12
Creation date: Jun 30, 2016
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=tsa-test.moraal.ee, O=Moraal, L=Tallinn, ST=Harjumaa, C=EE
Issuer: CN=tsa-test.moraal.ee, O=Moraal, L=Tallinn, ST=Harjumaa, C=EE
Serial number: ccf937bbdc275300
Valid from: Thu Jun 30 11:49:29 EEST 2016 until: Sun Jun 28 11:49:29 EEST 2026
Certificate fingerprints:
         MD5:  3B:97:97:31:0C:58:01:FC:BF:11:62:AE:AE:67:08:D6
         SHA1: ED:51:0D:A6:C2:A0:1D:59:8F:93:9E:9A:67:32:01:DC:C5:BE:19:35
         SHA256: D5:B7:7E:40:09:BB:CE:90:00:51:E4:FC:DF:6C:54:8D:F5:BD:17:A2:D5:54:F3:6A:63:2C:5B:27:ED:49:95:C7
         Signature algorithm name: SHA256withRSA
         Version: 3

Extensions:  

#1: ObjectId: 2.5.29.37 Criticality=true
ExtendedKeyUsages [
  timeStamping 
]

TSA mooduli kasutamise ettevalmistamine ja käivitamine

TSA mooduli kasutamiseks on vaja sertifikaati ja võtit, millega ajatempleid tekitada ning nn TSA workeri seadistusfaili

  • /opt/signserver/conf/soft-crypto-configuration.properties
  • /opt/signserver/p12/tsa-test.moraal.ee.p12 - võti-sertifikaat

soft-crypto tokeni seadisus

$ cat conf/soft-crypto-configuration.properties
GLOB.WORKERGENID1.CLASSPATH = org.signserver.module.tsa.TimeStampSigner
GLOB.WORKERGENID1.SIGNERTOKEN.CLASSPATH = org.signserver.server.cryptotokens.P12CryptoToken
WORKERGENID1.KEYSPEC=2048
WORKERGENID1.NAME=DEV_P12
WORKERGENID1.AUTHTYPE=NOAUTH
WORKERGENID1.ACCEPTEDALGORITHMS=SHA1;SHA224;SHA256;SHA384;SHA512
WORKERGENID1.SIGNATUREALGORITHM=SHA512WithRSA
WORKERGENID1.ARCHIVER0.USE_FORWARDED_ADDRESS=true
WORKERGENID1.KEYSTOREPATH=/opt/signserver/p12/tsa-test.moraal.ee.p12
WORKERGENID1.KEYSTOREPASSWORD=parool
# DISABLEKEYUSAGECOUNTER=FALSE
WORKERGENID1.DEFAULTTSAPOLICYOID=0.4.0.2023.1.1
WORKERGENID1.DEFAULTKEY=DEV_P12
WORKERGENID1.TSA_FROM_CERT=true
WORKERGENID1.ACCURACYSECONDS=1


Selleks, et bin/signserver utiliit saaks suhelda wildfly'ga peab ta kasutama sobivat porti

$ grep ^remote.connection.default.port ./conf/jboss7/jboss-ejb-client.properties 
remote.connection.default.port = 8080

ja seadistuse kehtestamiseks öelda

$ bin/signserver setproperties conf/soft-crypto-configuration.properties
$ bin/signserver reload 1

Tulemusena, kus on näha, et token on aktiivne ja worker samuti

$ bin/signserver getstatus brief all
Current version of server is : SignServer CE 3.7.0

Status of Signer with id 1 (DEV_P12) is:
   Worker status : Active
   Token status  : Active
   Signings      : 12

Kasutamine

Ajatempli võtmine, nt pöörata tähelepanu URI'ile

$ /usr/lib/ssl/misc/tsget -h http://localhost:8080/signserver/tsa?workerId=1 tekst.req

Kontrollimine

$ openssl ts -verify -queryfile tekst.req -in tekst.tsr -CAfile tsa-test.moraal.ee.crt
Verification: OK

Kasulikud lisamaterjalid

Mitme TSA teenuse eksemplari pidamine

Kui on vajadus teenindada test ja toodangu kasutajate ajatembeldust, siis saab seda teha juurutades järgmise nn SignServer workeri. Selleks tuleb

  • valmistada vajalikud sertifikaadid ning moodustada vastav .p12 fail
  • valistada sobiva sisuga properties fail, nt conf/soft-crypto-configuration-test.properties
GLOB.WORKERGENID2.CLASSPATH = org.signserver.module.tsa.TimeStampSigner
GLOB.WORKERGENID2.SIGNERTOKEN.CLASSPATH = org.signserver.server.cryptotokens.P12CryptoToken
WORKERGENID2.KEYSPEC=2048
WORKERGENID2.NAME=TEST_P12
WORKERGENID2.AUTHTYPE=NOAUTH
WORKERGENID2.ACCEPTEDALGORITHMS=SHA1;SHA224;SHA256;SHA384;SHA512
WORKERGENID2.SIGNATUREALGORITHM=SHA512WithRSA
WORKERGENID2.ARCHIVER0.USE_FORWARDED_ADDRESS=true
WORKERGENID2.KEYSTOREPATH=/opt/signserver/p12/demo-toodang-moraal.p12
WORKERGENID2.KEYSTOREPASSWORD=testparool
# DISABLEKEYUSAGECOUNTER=FALSE
WORKERGENID2.DEFAULTTSAPOLICYOID=0.4.0.2023.1.1
WORKERGENID2.DEFAULTKEY=TEST_P12
WORKERGENID2.TSA_FROM_CERT=true
WORKERGENID2.ACCURACYSECONDS=1

kus on muudetud

  • ID1 -> ID2
  • DEV_P12 -> TEST_P12
  • keystore path
  • keystore parool

ning öelda

$ bin/signserver setproperties conf/soft-crypto-configuration-test.properties
$ bin/signserver reload 2

ja tulemus peaks paistma selline

$ bin/signserver getstatus brief all
Current version of server is : SignServer CE 3.7.0

Status of Signer with id 1 (DEV_P12) is:
  Worker status : Active
  Token status  : Active
  Signings      : 47

Status of Signer with id 2 (TEST_P12) is:
  Worker status : Active
  Token status  : Active
  Signings      : 2

Teenust saab kasutada aadressilt http://localhost:8080/signserver/tsa?workerId=2

Märkused

  • workeri eemaldamine
$ bin/signserver removeworker 1
  • otse mällu muudatuse tegemine
$ bin/signserver setproperty 1 DEFAULTTSAPOLICYOID 0.2023.1.1
  • MariaDB baasi kasutamine

PostgreSQL baasi asemel sobib nt sarnasse sektsiooni abil kasutada MariaDB andmebaasi

$ egrep -v "^#|^$" conf/signserver_deploy.properties
datasource.jndi-name=SignServerDS
datasource.jndi-name-prefix=java:/
database.name=mysql
database.url=jdbc:mysql://127.0.0.1/signserver
database.username=signserver
database.password=signserver
signserverws.enabled=true
genericws.enabled=true
validationws.enabled=true
adminws.enabled=true
clientws.enabled=true

Kasulikud lisamaterjalid