Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions core/src/main/groovy/noe/server/Httpd.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ abstract class Httpd extends ServerAbstract {
String cachePath // directory for mod_cache caching
File postInstallErrFile
File postInstallOutFile
File sslCertDir

Httpd(String basedir, version) {
super(basedir, version)
Expand All @@ -67,11 +66,10 @@ abstract class Httpd extends ServerAbstract {
this.cachePath = this.basedir + platform.sep + 'cache'
postInstallErrFile = new File(getHttpdServerRootFull(), 'httpdPostInstallErr.log')
postInstallOutFile = new File(getHttpdServerRootFull(), 'httpdPostInstallOut.log')
String sslStringDir = PathHelper.join(platform.tmpDir, "ssl", "self_signed")
this.sslCertDir = new File(sslStringDir)
this.sslCertificate = new File(sslCertDir, "server.crt").absolutePath
this.sslKey = new File(sslCertDir, "server.key").absolutePath
this.keystorePath = new File(sslCertDir, "server.jks").absolutePath
String sslStringDir = PathHelper.join(platform.tmpDir, "ssl", "proper", "generated", "ca", "intermediate")
this.sslCertificate = new File(PathHelper.join(sslStringDir, "certs"), "localhost.server.cert.pem").absolutePath
this.sslKey = new File(PathHelper.join(sslStringDir, "private"), "localhost.server.key.pem").absolutePath
this.keystorePath = new File(PathHelper.join(sslStringDir, "keystores"),"localhost.server.keystore.jks").absolutePath
}

static ServerAbstract getInstance(String basedir, version, String httpdDir = '', NoeContext context = NoeContext.forCurrentContext()) {
Expand Down
10 changes: 5 additions & 5 deletions core/src/main/groovy/noe/server/ServerAbstract.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -98,11 +98,11 @@ abstract class ServerAbstract implements IApp {
this.serverRoot = basedir
this.host = (host) ?: DefaultProperties.HOST
this.ignoreShutdownPort = true
this.sslCertificate = getDeplSrcPath() + "${platform.sep}ssl${platform.sep}self_signed${platform.sep}server.crt"
this.sslKey = getDeplSrcPath() + "${platform.sep}ssl${platform.sep}self_signed${platform.sep}server.key"
this.keystorePath = getDeplSrcPath() + "${platform.sep}ssl${platform.sep}self_signed${platform.sep}server.jks"
this.truststorePassword = 'changeit'
this.sslKeystorePassword = 'changeit'
this.sslCertificate = getDeplSrcPath() + "${platform.sep}ssl${platform.sep}proper${platform.sep}generated${platform.sep}ca${platform.sep}intermediate${platform.sep}certs${platform.sep}localhost.server.cert.pem"
this.sslKey = getDeplSrcPath() + "${platform.sep}ssl${platform.sep}proper${platform.sep}generated${platform.sep}ca${platform.sep}intermediate${platform.sep}private${platform.sep}localhost.server.key.pem"
this.keystorePath = getDeplSrcPath() + "${platform.sep}ssl${platform.sep}proper${platform.sep}generated${platform.sep}ca${platform.sep}intermediate${platform.sep}keystores${platform.sep}localhost.server.keystore.jks"
this.truststorePassword = 'testpass'
this.sslKeystorePassword = 'testpass'
this.pid = null
setRunAs(loadRunAs())
this.processCode = String.valueOf(Math.abs(this.hashCode()))
Expand Down
10 changes: 4 additions & 6 deletions core/src/main/groovy/noe/server/Tomcat.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ class Tomcat extends ServerAbstract implements WorkerServer {
def rootBasedir
File postInstallErrFile
File postInstallOutFile
File sslCertDir //Path to directory holding ssl certificates

Tomcat(String basedir, version) {
super(basedir, version)
Expand All @@ -62,11 +61,10 @@ class Tomcat extends ServerAbstract implements WorkerServer {
this.cfgHost = (cfgHost) ?: ''
postInstallErrFile = new File(basedir, 'tomcatPostInstallErr.log')
postInstallOutFile = new File(basedir, 'tomcatPostInstallOut.log')
String sslStringDir = PathHelper.join(platform.tmpDir, "ssl", "self_signed")
this.sslCertDir = new File(sslStringDir)
this.sslCertificate = new File(sslCertDir, "server.crt").absolutePath
this.sslKey = new File(sslCertDir, "server.key").absolutePath
this.keystorePath = new File(sslCertDir, "server.jks").absolutePath
String sslStringDir = PathHelper.join(platform.tmpDir, "ssl", "proper", "generated", "ca", "intermediate")
this.sslCertificate = new File(PathHelper.join(sslStringDir, "certs"), "localhost.server.cert.pem").absolutePath
this.sslKey = new File(PathHelper.join(sslStringDir, "private"), "localhost.server.key.pem").absolutePath
this.keystorePath = new File(PathHelper.join(sslStringDir, "keystores"),"localhost.server.keystore.jks").absolutePath

}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package noe.tomcat.configure

import noe.common.utils.Platform
import noe.common.utils.PathHelper

/**
* Abstraction for secure HTTP connector to configure Tomcat server.xml.
Expand Down Expand Up @@ -53,23 +54,22 @@ public class SecureHttpConnectorTomcat extends ConnectorTomcatAbstract<SecureHtt
}

/**
* Configure secure http connector to expect certificates in ${SYSTEM_TEMP}/ssl/self_signed directory
* Configure secure http connector to expect certificates in ${SYSTEM_TEMP}/ssl/proper/generated/ca/intermediate directory
* Expected names:
* <ul>
* <li>certificate = server.crt</li>
* <li>key file = server.key</li>
* <li>keystore = server.jks</li>
* <li>certificate = localhost.server.cert.pem</li>
* <li>key file = localhost.server.key.pem</li>
* <li>keystore = localhost.server.keystore.jks</li>
* <li></li>
* </ul>
* Password for keystore, trustore and SSL sets to "changeit" (without apostrophes).
*/
SecureHttpConnectorTomcat setDefaultCertificatesConfiguration() {
String sslRoot = new File(new Platform().getTmpDir(), "ssl").getCanonicalPath()
String sslStringDir = new File(sslRoot, "self_signed").getCanonicalPath()
String sslCertificate = new File(sslStringDir, "server.crt").getCanonicalPath()
String sslCertificateKey = new File(sslStringDir, "server.key").getCanonicalPath()
String keystoreFilePath = new File(sslStringDir, "server.jks").getCanonicalPath()
String password = "changeit"
String sslIntermediate = PathHelper.join(new Platform().getTmpDir(), "ssl", "proper", "generated", "ca", "intermediate")
String sslCertificate = new File(PathHelper.join(sslIntermediate, "certs"), "localhost.server.cert.pem").getCanonicalPath()
String sslCertificateKey = new File(PathHelper.join(sslIntermediate, "private"), "localhost.server.key.pem").getCanonicalPath()
String keystoreFilePath = new File(PathHelper.join(sslIntermediate, "keystores"), "localhost.server.keystore.jks").getCanonicalPath()
String password = "testpass"

setSslCertificateFile(sslCertificate)
setSslCertificateKeyFile(sslCertificateKey)
Expand Down
21 changes: 9 additions & 12 deletions core/src/main/groovy/noe/workspace/WorkspaceAbstract.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -120,25 +120,22 @@ abstract class WorkspaceAbstract implements IWorkspace {
}

/**
* Copies self-signed, pre-generated certificates from noe core to ${tmpdir}/ssl/self_signed directory.
* Copies intermediate certs, pre-generated certificates from noe core to ${tmpdir}/ssl/proper/generated/ca/intermediate directory.
*
*/
void copyCertificates() {
List<String> certificates = ["server.crt", "server.jks", "server.key", "server.p12"]
String sslStringDir = PathHelper.join(platform.tmpDir, "ssl", "self_signed")
File sslDir = new File(sslStringDir)
String resourcesPath = "ssl/self_signed/" //resources jar path is always separated by /
String sslIntermediateDir = PathHelper.join(platform.tmpDir, "ssl", "proper", "generated", "ca", "intermediate")
File intermediateTmpDir = new File(sslIntermediateDir)
String intermediatePath = "ssl/proper/generated/ca/intermediate/"

if (!sslDir.exists()) {
JBFile.mkdir(sslDir)
if (!intermediateTmpDir.exists()) {
JBFile.mkdir(intermediateTmpDir)
}

JBFile.makeAccessible(sslDir)
JBFile.makeAccessible(intermediateTmpDir)

for (String certName : certificates) {
File certFile = Library.retrieveResourceAsFile("${resourcesPath}${certName}")
JBFile.move(certFile, sslDir)
}
File sslIntermediateFile = Library.retrieveResourceAsFile("${intermediatePath}")
JBFile.move(sslIntermediateFile, intermediateTmpDir)
}

void downloadClusterBench() {
Expand Down
18 changes: 18 additions & 0 deletions core/src/main/resources/ssl/proper/generated/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Small docker image specification to generate certificates on system that does include docker but not Java or OpenSSL
# docker build . -t "mydockerimage"
# docker run --rm -v $PWD/ca:/ca:z mydockerimage bash generate-trustchain.sh

FROM alpine

MAINTAINER Honza Kasik (https://github.com/honza-kasik)

RUN apk update && \
apk add --no-cache openssl && \
apk add --no-cache bash && \
apk add --no-cache openjdk8-jre-base && \
rm -rf /var/cache/apk/*

VOLUME /ca

COPY conf /conf
COPY generate-trustchain.sh /generate-trustchain.sh
21 changes: 21 additions & 0 deletions core/src/main/resources/ssl/proper/generated/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
This directory contains script to generate whole trustchain for testing purposes.
Complete description of generated structere may be found in [generate-trustchain.sh](generate-trustchain.sh).

## How to run

For quick, OS-independent generation, run following commands to perform build using docker:

```bash
IMAGE_NAME="my_cool_docker_image"
docker build . -t ${IMAGE_NAME}
docker run --rm -v $PWD/ca:/trustchain/ca:z ${IMAGE_NAME} bash generate-trustchain.sh

```

See [Dockerfile](Dockerfile) for further information on which version of Java (keytool) and OpenSSL is being used.

You can also run the script manually, if you have all dependencies installed (see [Dockerfile](Dockerfile)):

```bash
./generate-trustchain.sh
```
36 changes: 36 additions & 0 deletions core/src/main/resources/ssl/proper/generated/ca/certs/ca.cert.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----
1 change: 1 addition & 0 deletions core/src/main/resources/ssl/proper/generated/ca/crlnumber
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1000
1 change: 1 addition & 0 deletions core/src/main/resources/ssl/proper/generated/ca/index.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
V 290315113640Z 1000 unknown /C=CZ/ST=Czech Republic/O=Red Hat Czech, s.r.o./OU=EAP QE/CN=intermediate_mod_cluster_test_certificate/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
unique_subject = yes
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
-----BEGIN CERTIFICATE-----
MIIGQzCCBCugAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAkNa
MRcwFQYDVQQIDA5DemVjaCBSZXB1YmxpYzENMAsGA1UEBwwEQnJubzEeMBwGA1UE
CgwVUmVkIEhhdCBDemVjaCwgcy5yLm8uMQ8wDQYDVQQLDAZFQVAgUUUxIDAeBgkq
hkiG9w0BCQEWEWprYXNpa0ByZWRoYXQuY29tMSgwJgYDVQQDDB9jYV9tb2RfY2x1
c3Rlcl90ZXN0X2NlcnRpZmljYXRlMB4XDTE5MDMxODExMzY0MFoXDTI5MDMxNTEx
MzY0MFowga0xCzAJBgNVBAYTAkNaMRcwFQYDVQQIDA5DemVjaCBSZXB1YmxpYzEe
MBwGA1UECgwVUmVkIEhhdCBDemVjaCwgcy5yLm8uMQ8wDQYDVQQLDAZFQVAgUUUx
MjAwBgNVBAMMKWludGVybWVkaWF0ZV9tb2RfY2x1c3Rlcl90ZXN0X2NlcnRpZmlj
YXRlMSAwHgYJKoZIhvcNAQkBFhFqa2FzaWtAcmVkaGF0LmNvbTCCAiIwDQYJKoZI
hvcNAQEBBQADggIPADCCAgoCggIBALR9WEo2ZH1sGnfWopQDGHiE2Y9nbYbpQa5P
Y4AWaFEwsF0A9f+PwCin5DK75LO9xNqbMZO4yIO+gg7zrbqA/52Xj2P7vKX/QJgY
Yxwl+UA5liX/ADt1SuKBRUIEHLaihM2UvXDJQ46KwI6kxXbl52WOrj1xFdJq1WOT
hN1VsnP1RY3czpcZcac9Q2TlKr67EXZOljVXWMfOX+AIWwFAHldNsWfF0mKSlpfP
Vpa800p+LmOdfPD/wQe+sDtfzhJ5Os8bSdcqDi86X6QZ/seGbOdHT7cACYqzZ3l3
gfJG76mi9VZ+/pFRmUBc2vGzJHeykPoCMprCLT50CLGjFq/+UZ8XoFDaCGH731Qk
65s93y09c5Ps4d89pdaE77gdgVxiol7HEuFQVov6JcDrU0+Gxoi0jCnz6MvpY+3Y
CSVjgzV904/KAbI4MsVey8b1D+od/xzyvB+7+lXohInzQ/QOjvQq+UCHtEVadIOE
U9WwytD4ajSw1Z9tsNCNUvYQVklj6bnt64LnG90FlJwzGha5CrN46iPIlh+6NOuN
uB+5vsNlQUxtu8avQyDlcu1eRvtOIMaNOXyX2qTM2wB1vEyIpTCUUeEk4wdHf9T1
pcGrxKuvZYDAqk8uUrnwtfxFF4YIAilzZQo1BFTiR85/Je/9xZHCSTNGxxLnSa7K
ogSm7y95AgMBAAGjZjBkMB0GA1UdDgQWBBTeT66yDM5+epU5/8NFHdlr6Kk6dzAf
BgNVHSMEGDAWgBTheIJoFEQJomtlr1YW8dyg/qYYZDASBgNVHRMBAf8ECDAGAQH/
AgEAMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAbh6Jwd/nJpNb
gyECw+ftKYqb9N7ZniFPutVe5WCSgXzd6cYVO0RqjFNW8w2xTitnPOFSRZGJSuna
/F2qmExQtw2RLpYn1e9x8u8iq4DKHd3+6l9hEFPLHH1zeH0rui+EsDm2xlT0AOm2
J+exy6ZVBG9ZacvWnaSV2xgPvZRAxbnoiiBFRxJgbbbX1ESdlMs/sdU9f45ODkTR
iC7dXTr1u9TfOFkOp2rGprZMSwp7ZfxBsJ8zSgkNr92lVMtKgUyu7/2FAdojsRBE
M2JL7oP7OnXixpwktSYyLaPzdd7TwTEziDdBiVqwmkl3tAEUZTqkHTjhfvTfwQLc
4b34mSqKi+b28hQSvZ3L4yu5y6Gwd/qUEUjQWIW20TXnXyyg/IHs7G1t9zc2nA8b
GuG/R+6nVjOiuhjIE99GP5/c/bFb634k2eY5X53yTtpXT8VPbjb3zYO4QqUYJQuH
hjhJG4AN0I4x731L6RQWWm38OMe7m3nEcGKJXX0+U7AJbZ/f+pvTN6zg2U4NpLMY
2A9niDp3kzs+/gQKIn4nQbQixo4nr7jPPeIQanvLwtCLeb4eA0NYEDuwecDnofFV
Xa456DxpwSXnDo0AJl6KXNI/5aEGfQElbBzlIx+IULYg8sqoTj3Lw/x9i05bgRG3
IJcfuL0ptwEsS6u06TeYfcd7pHjuoiI=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
-----BEGIN CERTIFICATE-----
MIIGQzCCBCugAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAkNa
MRcwFQYDVQQIDA5DemVjaCBSZXB1YmxpYzENMAsGA1UEBwwEQnJubzEeMBwGA1UE
CgwVUmVkIEhhdCBDemVjaCwgcy5yLm8uMQ8wDQYDVQQLDAZFQVAgUUUxIDAeBgkq
hkiG9w0BCQEWEWprYXNpa0ByZWRoYXQuY29tMSgwJgYDVQQDDB9jYV9tb2RfY2x1
c3Rlcl90ZXN0X2NlcnRpZmljYXRlMB4XDTE5MDMxODExMzY0MFoXDTI5MDMxNTEx
MzY0MFowga0xCzAJBgNVBAYTAkNaMRcwFQYDVQQIDA5DemVjaCBSZXB1YmxpYzEe
MBwGA1UECgwVUmVkIEhhdCBDemVjaCwgcy5yLm8uMQ8wDQYDVQQLDAZFQVAgUUUx
MjAwBgNVBAMMKWludGVybWVkaWF0ZV9tb2RfY2x1c3Rlcl90ZXN0X2NlcnRpZmlj
YXRlMSAwHgYJKoZIhvcNAQkBFhFqa2FzaWtAcmVkaGF0LmNvbTCCAiIwDQYJKoZI
hvcNAQEBBQADggIPADCCAgoCggIBALR9WEo2ZH1sGnfWopQDGHiE2Y9nbYbpQa5P
Y4AWaFEwsF0A9f+PwCin5DK75LO9xNqbMZO4yIO+gg7zrbqA/52Xj2P7vKX/QJgY
Yxwl+UA5liX/ADt1SuKBRUIEHLaihM2UvXDJQ46KwI6kxXbl52WOrj1xFdJq1WOT
hN1VsnP1RY3czpcZcac9Q2TlKr67EXZOljVXWMfOX+AIWwFAHldNsWfF0mKSlpfP
Vpa800p+LmOdfPD/wQe+sDtfzhJ5Os8bSdcqDi86X6QZ/seGbOdHT7cACYqzZ3l3
gfJG76mi9VZ+/pFRmUBc2vGzJHeykPoCMprCLT50CLGjFq/+UZ8XoFDaCGH731Qk
65s93y09c5Ps4d89pdaE77gdgVxiol7HEuFQVov6JcDrU0+Gxoi0jCnz6MvpY+3Y
CSVjgzV904/KAbI4MsVey8b1D+od/xzyvB+7+lXohInzQ/QOjvQq+UCHtEVadIOE
U9WwytD4ajSw1Z9tsNCNUvYQVklj6bnt64LnG90FlJwzGha5CrN46iPIlh+6NOuN
uB+5vsNlQUxtu8avQyDlcu1eRvtOIMaNOXyX2qTM2wB1vEyIpTCUUeEk4wdHf9T1
pcGrxKuvZYDAqk8uUrnwtfxFF4YIAilzZQo1BFTiR85/Je/9xZHCSTNGxxLnSa7K
ogSm7y95AgMBAAGjZjBkMB0GA1UdDgQWBBTeT66yDM5+epU5/8NFHdlr6Kk6dzAf
BgNVHSMEGDAWgBTheIJoFEQJomtlr1YW8dyg/qYYZDASBgNVHRMBAf8ECDAGAQH/
AgEAMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAbh6Jwd/nJpNb
gyECw+ftKYqb9N7ZniFPutVe5WCSgXzd6cYVO0RqjFNW8w2xTitnPOFSRZGJSuna
/F2qmExQtw2RLpYn1e9x8u8iq4DKHd3+6l9hEFPLHH1zeH0rui+EsDm2xlT0AOm2
J+exy6ZVBG9ZacvWnaSV2xgPvZRAxbnoiiBFRxJgbbbX1ESdlMs/sdU9f45ODkTR
iC7dXTr1u9TfOFkOp2rGprZMSwp7ZfxBsJ8zSgkNr92lVMtKgUyu7/2FAdojsRBE
M2JL7oP7OnXixpwktSYyLaPzdd7TwTEziDdBiVqwmkl3tAEUZTqkHTjhfvTfwQLc
4b34mSqKi+b28hQSvZ3L4yu5y6Gwd/qUEUjQWIW20TXnXyyg/IHs7G1t9zc2nA8b
GuG/R+6nVjOiuhjIE99GP5/c/bFb634k2eY5X53yTtpXT8VPbjb3zYO4QqUYJQuH
hjhJG4AN0I4x731L6RQWWm38OMe7m3nEcGKJXX0+U7AJbZ/f+pvTN6zg2U4NpLMY
2A9niDp3kzs+/gQKIn4nQbQixo4nr7jPPeIQanvLwtCLeb4eA0NYEDuwecDnofFV
Xa456DxpwSXnDo0AJl6KXNI/5aEGfQElbBzlIx+IULYg8sqoTj3Lw/x9i05bgRG3
IJcfuL0ptwEsS6u06TeYfcd7pHjuoiI=
-----END CERTIFICATE-----
Loading