Skip to content

Instantly share code, notes, and snippets.

@vbatts
Last active May 13, 2020 00:17
Show Gist options
  • Save vbatts/0afaee5c394b52a95f2d to your computer and use it in GitHub Desktop.
Save vbatts/0afaee5c394b52a95f2d to your computer and use it in GitHub Desktop.
renegotiation example
.client
.server
Dockerfile

Overview

This example illustrates that with a server configuration where SSL is enabled globally and SSLVerifyClient is only required for a particular route, golang crypto/tls Conn will trigger a no renegotiation alert when transitioning into the route requiring a client certificate. (http://golang.org/src/crypto/tls/conn.go#L655).

This is known issue per golang/go#5742

The pcap file demonstrates that the Client provides the "renegotiation_info" extension in the ClientHello. There is a screenshot of the ClientHello included as well.

According to RFC 5746 (https://tools.ietf.org/html/rfc5746#section-3.6):

* The server MUST check if the "renegotiation_info" extension is included in the
  ClientHello.  If the extension is present, set secure_renegotiation flag to
  TRUE.  The server MUST then verify that the length of the
  "renegotiated_connection" field is zero, and if it is not, MUST abort the
  handshake.

* If neither the TLS_EMPTY_RENEGOTIATION_INFO_SCSV SCSV nor the
  "renegotiation_info" extension was included, set the secure_renegotiation flag
  to FALSE.  In this case, some servers may want to terminate the handshake
  instead of continuing; see Section 4.3 for discussion.

It appears this golang client is implementing the first bullet, but since secure renegotiation is not actually supported in the client, the potential for a confusing situation exists: the handshake is initiated, but sometime later the session aborts at the time of renegotiation.

Instead, I propose that the golang client implement the second bullet (i.e. not providing a renegotiation_info extension) where it makes it clear to the server that the client will not support secure renegotation. Not providing the extension runs the risk that some servers will reject the connection, but I feel it is better to hit the issue early and directly rather than having a hidden problem that can surface much later.

Alternatively, the problem could be addressed by actually implementing secure renegotiation. I understand that secure renegotiation is not supported currently due to the "triple handshake attack" which is a valid concern. However, ECDHE cipher suites are not vulnerable to this particular attack [1]. Perhaps it would be possible for golang to optionally support secure renegotiation and when doing so only provide ECDHE suites in the ClientHello (until the protocol vulnerability is addressed by IETF).

[1] Mentioned in "Bulletproof SSL and TLS" by Ivan Ristic and briefly in http://blog.cryptographyengineering.com/2014/04/attack-of-week-triple-handshakes-3shake.html in the "So What's the Problem Here?" section: "It does not seem to work on ECDHE".

Usage

$> make run

Tail of output

&{200 OK 200 HTTP/1.1 1 1 map[Last-Modified:[Thu, 15 Jan 2015 19:30:15 GMT] Etag:["6-50cb5e2aa9fc0"] Accept-Ranges:[bytes] Content-Length:[6] Content-Type:[text/html; charset=UTF-8] Date:[Thu, 15 Jan 2015 19:48:06 GMT] Server:[Apache/2.4.10 (Fedora) OpenSSL/1.0.1e-fips]] 0xc2080962c0 6 [] false map[] 0xc20802a820 0xc208004ba0}
[Thu Jan 15 19:48:06.686639 2015] [ssl:debug] [pid 13] ssl_engine_kernel.c(243): [client 127.0.0.1:56715] AH02034: Subsequent (No.2) HTTPS request received for child 0 (server localhost:443)
[Thu Jan 15 19:48:06.686725 2015] [ssl:debug] [pid 13] ssl_engine_kernel.c(591): [client 127.0.0.1:56715] AH02255: Changed client verification type will force renegotiation
[Thu Jan 15 19:48:06.686737 2015] [ssl:info] [pid 13] [client 127.0.0.1:56715] AH02221: Requesting connection re-negotiation
[Thu Jan 15 19:48:06.686753 2015] [ssl:debug] [pid 13] ssl_engine_kernel.c(791): [client 127.0.0.1:56715] AH02260: Performing full renegotiation: complete handshake protocol (client does support secure renegotiation)
[Thu Jan 15 19:48:06.686830 2015] [ssl:info] [pid 13] [client 127.0.0.1:56715] AH02226: Awaiting re-negotiation handshake
2015/01/15 19:48:06 FATAL: Get https://localhost:443/secret: local error: no renegotiation
[Thu Jan 15 19:48:06.688010 2015] [ssl:error] [pid 13] [client 127.0.0.1:56715] AH02261: Re-negotiation handshake failed: Not accepted by client!?
[Thu Jan 15 19:48:06.688122 2015] [ssl:info] [pid 13] [client 127.0.0.1:56715] AH02006: SSL handshake stopped: connection was closed
[Thu Jan 15 19:48:06.688143 2015] [ssl:info] [pid 13] [client 127.0.0.1:56715] AH01998: Connection closed to child 0 with abortive shutdown (server localhost:443)

Debugging SSL with Wireshark

Wireshark can dissect SSL and show you the HTTP underneath.

Here's how:

  1. Install wireshark and add yourself to the wireshark group so you don't have to run it as root all the time.

    $ sudo yum install wireshark-gnome
    $ sudo usermod -a -G wireshark `whoami`
    

    Log in to the new group (so you don't have to log out and back in again).

    $ newgrp wireshark
    

    Make sure you're in the group.

    $ groups
    ... wireshark ...
    
  2. Run Wireshark.

  3. Go to Edit -> Preferences. Click Protocols. Go to SSL. Enter a value for SSL debug file.1 (I use /tmp/ssl.debug). Click RSA keys list. Click new and add the following entry for your localhost:

    IP address: 127.0.0.1
    Port: 9001
    Protocol: http
    Key File: /path/to/server.key
    
  4. Go to Capture -> Options. Select the interface you want to listen on. This step is very important and it took me a long time to figure this out. Do not listen on the pseudo-interface "any". If you listen to "any", sometimes you'll get a bunch of TCP retransmissions. These retransmission packets will break the SSL dissector.2 3 Instead check the box for the appropriate interface. "em1" if you're getting packets from another machine, and "lo" if the packets are coming from localhost. (You can check all three of these options if you want and Wireshark will listen to all three interfaces. I haven't seen the retransmission problem when doing this.)

  5. Double click on interface to add a filter. In the Capture Filter box enter "port 9001" to filter calls to those hitting the Candlepin default port. Filters are very powerful and you can do a lot of fancy stuff with them. Learn more at http://wiki.wireshark.org/CaptureFilters

  6. Exit the interface settings by clicking OK and then click Start on the Capture Options dialog.

  7. You are now sniffing packets

  8. Make a SSL connection and you'll start seeing packets populate the window. You can enter "http" in the Filter box if you just want to see the HTTP requests or "ssl" if you want to see the SSL stuff too.

Footnotes

Footnotes

  1. Used to be required because of https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6033 but now it's just good practice.

  2. http://www.wireshark.org/lists/wireshark-dev/200805/msg00067.html

  3. http://www.wireshark.org/lists/wireshark-dev/201202/msg00071.html

-----BEGIN CERTIFICATE-----
MIICxTCCAa0CCQCSw7873SZw4TANBgkqhkiG9w0BAQUFADAfMQswCQYDVQQGEwJV
UzEQMA4GA1UEAwwHVGVzdCBDQTAeFw0xNTAxMDYyMTMyMDRaFw00NTAyMTcyMTMy
MDRaMCoxCzAJBgNVBAYTAlVTMRswGQYDVQQDDBJDbGllbnQgQ2VydGlmaWNhdGUw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbJPITTYyNrmLSYXiyH+Ll
Qvab8tLw2MAiAl/Er1mwsjL+ichZFDdd2FDO0FtGY/0vR2+QjGk+1Hd/YRYqTPBA
6FGc2tK8itZlWQE/6lZgHLlheTXmsNlKWKyalM09XoQKLzQbWDqnBMELNTiHduRw
ErV9+FOhFlhFtMh+1hJbSszXDh+9YZSDvlm5Cyl6lSB/ycN0vmMmRgyfhueJgjSQ
DzQN3zYLez/oqKJPidYL3lqiKh9G6FN+9FQwatXC/hr58hUsq8UsJ2qkv+y3Bzkn
zZ2TszY5oo83+SQj5wgsKzLGyd9P2cu7s3mXjwSpPuFK1OgPkezQmc+6tnOqo5yL
AgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAFgbj4UydU1XM+wCbO7po/c5cBb+wIgt
Y/AyjP3yZA6KuojuskYo9SMaltv9g+ViSH4F5mKVqkdQyro/kyHfBtQkpAZBNyDm
9+yyFrydNkwY1QRKxvUMWxd4pSlrst4MLhTNqvdSsGoJfVxwEoBnUsoQSrE0aMVT
ihz22dO5Iy6eCWZ/v26T+rKN3Ogr3CHZxec07qGQHhcibIACcTUqgLKAfSF6b8bE
vAC7MQHHjDAdGapUS0AjQoJpDH4U4Zo+8wUqAFlPS873aiYj4YC0OuIQWfNhYCRE
T4p7kQ+HNUJ5jQruGHGrEacKDd/tYWgbnRXiRO+hBlEDnDriHc/q6SY=
-----END CERTIFICATE-----
package main
import (
"crypto/tls"
"crypto/x509"
"flag"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
)
var (
flServerCertFile = flag.String("ca", "", "")
flClientCertFile = flag.String("cert", "", "")
flClientKeyFile = flag.String("key", "", "")
flAddr = flag.String("addr", os.Getenv("R_PORT_443_TCP_ADDR"), "")
flPort = flag.String("port", os.Getenv("R_PORT_443_TCP_PORT"), "")
)
func main() {
flag.Parse()
var (
certs []tls.Certificate
serverCertData []byte
certData []byte
keyData []byte
err error
)
if len(*flServerCertFile) == 0 || len(*flClientCertFile) == 0 || len(*flClientKeyFile) == 0 {
log.Fatal("provide -ca, -cert, and -key")
}
if serverCertData, err = ReadFile(*flServerCertFile); err != nil {
log.Fatalf("%q: %s", *flServerCertFile, err)
}
if certData, err = ReadFile(*flClientCertFile); err != nil {
log.Fatalf("%q: %s", *flClientCertFile, err)
}
if keyData, err = ReadFile(*flClientKeyFile); err != nil {
log.Fatalf("%q: %s", *flClientKeyFile, err)
}
if len(*flAddr) == 0 || len(*flPort) == 0 {
log.Fatal("provide -addr and -port of the server")
}
pool := x509.NewCertPool()
pool.AppendCertsFromPEM([]byte(serverCertData))
cert, err := tls.X509KeyPair([]byte(certData), []byte(keyData))
if err != nil {
fmt.Println(err)
return
}
certs = append(certs, cert)
tlsConfig := tls.Config{
RootCAs: pool,
// Avoid fallback to SSL protocols < TLS1.0
MinVersion: tls.VersionTLS10,
MaxVersion: tls.VersionTLS10,
Certificates: certs,
}
httpTransport := &http.Transport{
//DisableKeepAlives: true,
Proxy: http.ProxyFromEnvironment,
TLSClientConfig: &tlsConfig,
}
client := &http.Client{
Transport: httpTransport,
}
// SSLVerifyClient optional
res, err := client.Get(fmt.Sprintf("https://%s:%s/", *flAddr, *flPort))
if err != nil {
log.Fatal("FATAL: ", err)
}
defer res.Body.Close()
if buf, err := ioutil.ReadAll(res.Body); err != nil {
log.Fatal("ERROR: ", err)
} else {
log.Printf("GOT: %s", buf)
}
fmt.Println(res)
// SSLVerifyClient require
res, err = client.Get(fmt.Sprintf("https://%s:%s/secret", *flAddr, *flPort))
if err != nil {
log.Fatal("FATAL: ", err)
}
defer res.Body.Close()
if buf, err := ioutil.ReadAll(res.Body); err != nil {
log.Println("ERROR: ", err)
} else {
log.Printf("GOT: %s", buf)
}
fmt.Println(res)
}
func ReadFile(path string) ([]byte, error) {
fh, err := os.Open(path)
if err != nil {
return nil, err
}
defer fh.Close()
return ioutil.ReadAll(fh)
}
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAmyTyE02Mja5i0mF4sh/i5UL2m/LS8NjAIgJfxK9ZsLIy/onI
WRQ3XdhQztBbRmP9L0dvkIxpPtR3f2EWKkzwQOhRnNrSvIrWZVkBP+pWYBy5YXk1
5rDZSlismpTNPV6ECi80G1g6pwTBCzU4h3bkcBK1ffhToRZYRbTIftYSW0rM1w4f
vWGUg75ZuQspepUgf8nDdL5jJkYMn4bniYI0kA80Dd82C3s/6KiiT4nWC95aoiof
RuhTfvRUMGrVwv4a+fIVLKvFLCdqpL/stwc5J82dk7M2OaKPN/kkI+cILCsyxsnf
T9nLu7N5l48EqT7hStToD5Hs0JnPurZzqqOciwIDAQABAoIBADozsAUB0LrOMxCN
tIPOZoZviqiSfgQQrHOVxGu7BMC++VZ4Rgr1BJhWMGqFy9gqZq8382ic5FbHylSl
DXWtC2yuOv/HL8u/ohK/QzLBLMo9vGYO3OPAcKPthEMxk5V0QcC4WKnxfX9uzyTv
QFfBiI1q1198q5MBGPh9i8HZeWV5oqMH6TNqMSzcvoywrpTDJCuGPb0mn0thYH0c
/WKDsiNhHC3jtQhVXqlvMYum9y0TGZEV3a6TGjWyrYX9tqOz19XRsuK09/kkMy12
xhO74b2pqZQEULBQkstI9mnlyRs3vVY0VCg3luWsw3dBo3gZLQQWgVq/jMIw1Srh
61u/a+ECgYEAzo2Hm1TAZhuVJBWpkhXzDgfg7KP02zjtT0fcD5fC7HIegOlM9Nxu
E9eH3kk1Z/2Z9xq7iEXeIGvS3jvtPdQfoAFgciP0VzoPyF0ljU899xQUeknD+dSD
unLJb6c2YRCl4KkzvDvtZGDMpGR0qz/igKNPhpqWrtE8AGr5m83T/8MCgYEAwEjf
yn3LQx3b1Jmp/HZA+hisVGqoii0a+XVud5Jw/ogSUNF7NnVkxZ79CndnSeHtmtvX
T2H+AkC/rOJRhYJYf35U8iS6O9cEqL0o7HJoQuovDlz4ND70xjG/tko1YUV0B8V6
357T8ZkhQWfHQCIHa92mWi0QUnNC09VcBqN+K5kCgYEAgB0GtFCP+YU4LyaEg8i7
dcNrPju/ns2jW549nypJS7DIvLp38hRa7lGrwzLzPins+niJQs/bI47dPtw6nTPZ
3buc347veb7YlTU5GnnA/GRnAyaHuIiYn+eci3VSZEgYKs2n+iPNbYogxAJO3v0D
9zfUFrABsDK1Hak8Yuf6i1MCgYAsHkxizJwfqTEwRZWwHH3qJFEeCV7kXVcMF7qh
6tLMQ/JX4sivhR37DfCnPyBO3mzDFGABkc1TPQH9q+vigzbFAfqBmJW2dy5VfRlv
rwxnFg538DLu4ecNtopzS/GVgPcPdWss9edRTr5HoIUiHOyw/ilWFXLiSBn0Oscj
qs2fOQKBgGkXj9A2BWgdyDl657JSG/ucFlsOOnK0ctfPNzgVpCxdlJJLbRFYyonf
lAQiKFxi69iChlvON3VT9qxkeLzCT1Azk/oWiNKMRt8ohvmxqgQPbaBJ7lFHiJYt
Urum1Z62Tm5i8vgWGKEWKV93xHVsoCf6mvMpj1g1OuNco4OhqEwG
-----END RSA PRIVATE KEY-----
FROM fedora
RUN yum install -y httpd mod_ssl
RUN yum install -y golang
ADD . /data/
RUN cat /data/server.crt > /etc/pki/tls/certs/localhost.crt && \
cat /data/server.key > /etc/pki/tls/private/localhost.key && \
cat /data/test-ca.crt >> /etc/pki/tls/certs/ca-bundle.crt && \
cp /data/ssl.conf /etc/httpd/conf.d/ && \
echo HOWDY > /var/www/html/index.html && \
mkdir -p /var/www/html/secret && \
echo "It works!" > /var/www/html/secret/index.html
RUN cd /data && go build client.go
EXPOSE 443
CMD bash /data/run.sh
SERVERNAME := renegotiation-server
CLIENTNAME := renegotiation-client
DOCKER := docker
all: .build
.build: Dockerfile test-ca.crt server.crt server.key ssl.conf client.crt client.key run.sh client.go
$(DOCKER) build -t $(SERVERNAME) . && touch $@
run: .build
$(DOCKER) kill $(SERVERNAME) ; $(DOCKER) rm $(SERVERNAME) ; \
$(DOCKER) run -it --net=host --name $(SERVERNAME) -P $(SERVERNAME)
run-debug: .build
$(DOCKER) kill $(SERVERNAME) ; $(DOCKER) rm $(SERVERNAME) ; \
$(DOCKER) run -it --net=host --name $(SERVERNAME) -P $(SERVERNAME) bash
clean:
$(DOCKER) kill $(SERVERNAME) ; $(DOCKER) rm $(SERVERNAME) ; \
rm -f .build *~
#!/bin/bash
set -e
set -x
apachectl -DFOREGROUND &
/data/client -ca /data/test-ca.crt -cert /data/client.crt -key /data/client.key -addr localhost -port 443
-----BEGIN CERTIFICATE-----
MIICvDCCAaQCCQCSw7873SZw4jANBgkqhkiG9w0BAQUFADAfMQswCQYDVQQGEwJV
UzEQMA4GA1UEAwwHVGVzdCBDQTAeFw0xNTAxMDYyMTMzNThaFw00NTAyMTcyMTMz
NThaMCExCzAJBgNVBAYTAlVTMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDeJkoKOygjlpkU9LPJHo3D5UPjOLgnP6N9
BiuxL0amPJyMY03DJl3qEhpt2CFw2e+cma0Nvdih8EZ+qUGTA9CJOjQnUWzT1BH8
pufABHJ+wI1ZEZHBC7f4A4dmsP5nqWYQahcO/0SWpjm1eb/qwutMCQdgBGe7Jb1/
LzAKcXvFLF4R7eW2P+E7mXoIx1YnV9YFZ11qYsts30sj3XcQ3T7Sk1l5k1HCDKdf
YOexA5boZ8io2uPkxGqqan0CK4naHCUX2rhGXsMgkNrryd+k2Zrxeugv0lVYB1p/
OReHlcdz6RV3k6sK2cMSgHNmJ26SWnajY3hnVakSeP7Wl5SjvWt5AgMBAAEwDQYJ
KoZIhvcNAQEFBQADggEBAAoy9SHvcepRQHfF38kVs76uNpbTXEJ5lwcaoH7NXMne
XvxcD3epzxQDe62vS5eSjf2HOIusFchdKrpOyA1JI8DIVkUTUa7Od5yJTdx4Q1DN
YT3a9Eer8UvP4I+NNFf0MaLSx77V1oaCOA7+5po6M2FryiR7gkqLhw141WL0DnWu
FWiOEQFwl923V6+jwWiiwdbtI9bJoPUW7NBw71j023M2gmf86PAH6WbzjmPal/bv
PVWkcS1EkaFgY0WyadwrxfndzPM4wtVopKjBQ3U+ClUhn3WYuCkx/drPgKiE1v2H
ZsqxDetYoUFjYcnyP817NXA+Jri2rvnQKn65jwdSlxI=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA3iZKCjsoI5aZFPSzyR6Nw+VD4zi4Jz+jfQYrsS9GpjycjGNN
wyZd6hIabdghcNnvnJmtDb3YofBGfqlBkwPQiTo0J1Fs09QR/KbnwARyfsCNWRGR
wQu3+AOHZrD+Z6lmEGoXDv9ElqY5tXm/6sLrTAkHYARnuyW9fy8wCnF7xSxeEe3l
tj/hO5l6CMdWJ1fWBWddamLLbN9LI913EN0+0pNZeZNRwgynX2DnsQOW6GfIqNrj
5MRqqmp9AiuJ2hwlF9q4Rl7DIJDa68nfpNma8XroL9JVWAdafzkXh5XHc+kVd5Or
CtnDEoBzZiduklp2o2N4Z1WpEnj+1peUo71reQIDAQABAoIBAQCqLPKy+7Y37Pm/
z+SZwMogstRaj+yiRGHdOIjn5qtcVTonYTsEr7NpyAxu8Q5NAOZJNIAY8sGs6/9U
sBwHnvh05x1ksT+I1gAhZ0pJEh8TcjXVcVwSYgO//hQPWq7IgkApetvHJU1JinTS
zD10fXT6fkAkEbvU5YhQkblfhqel1nWouLOiHBt6jMfW8U9s77m7Wutxf0yziAW5
3ZYayAK2ds0E3nzauMeqU8hThRX6FSui5XxVCaq4WZsGLVMo0/YoED4CuFEh4ENa
ibjPIlcDucHYJRaMSQhb0HLpi3XrIDRE2QffBLNN/+UbYq2shcp1YIdwSETkdafh
Bo65Fl7xAoGBAPA5bt+NUOwLkGR4ew2yrOGI4zl567e/ONbX15CITW9+0SIiRPln
Ocd7nkd9La4IXwFTiogBxJhq/ejLm3ScGKCpABnarw2ajjSDHQ0qMJJp+Rcn4VYI
5LThYYBBuWwO2pRvAZzYI8UKMZX3vxh6mjtngy9uRCkxpHvBefqTjjb7AoGBAOy8
/UIHz3UALu2wem3KcMpKRoxZKxE3XZcvrM66gLAwZz/JeCZV8MjTUsGdsAutINaM
hbNQmfYDb3+3Kan273jzEvbtdY8Az+/3PjvyT+iotYjl9z7RVIOHe7CDkb+SD8BW
+BjN3cZLcB3EMpCit4bzc8pYdzEfX8JW8asd4q0bAoGAEuCQg+S4/TOTbzHAib0G
tNpq8LNSAKh4MPnZKLRtUVun14TV4rtn4PMn5vpBQrHJtXL5KeLprgiKV2bYmntB
vC5Lobx7kRgaIKpE+Cnek0LcniM2I+qi/kvPu6Jujb1FE/D9MXQSq4M3jk9fpu7L
e+uQdYO2u335LPhxO22o+U0CgYEAp2Hkashc7SupApOxrGjjIJQtl1QAeFa+DIQ/
2ZbSIEDI77fCBNDkwwlvTMfyTf8l5axLaAJIKUI6loFpquuWW9z5fq9cXDTF0LPu
Q7JKv4Rxfg6ipr6Y07p6QM51wY5DJsoW9mqwMGDsL4+l9M+nlXoSV3H/LDMzoJOa
oVMrDxsCgYEAlwXQMm8bkP243CIEIn0vU+LZ2IwRH5B2zKs4PYD0RpnFXz7LViY/
/meS4BzRcWN76n4wYKXQe1YbgGEh977RmNEgKhDc9UK9D/FZdybXBf9bUogQ/Opq
f8SShefbuuOWnNZit05Wqb4WQJXQujIePsNR1gozixMzDZejx1fj3zs=
-----END RSA PRIVATE KEY-----
ServerName localhost
Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout 300
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
<VirtualHost _default_:443>
# so we can see output in docker log
ErrorLog /proc/self/fd/1
TransferLog /proc/self/fd/2
LogLevel debug
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite RSA
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
SSLVerifyClient none
#DocumentRoot /data
<Location "/secret">
Allow from all
Options +FollowSymLinks +ExecCGI -MultiViews
SSLVerifyClient require
</Location>
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
-----BEGIN CERTIFICATE-----
MIICujCCAaICCQDGgKwZRwaVqDANBgkqhkiG9w0BAQUFADAfMQswCQYDVQQGEwJV
UzEQMA4GA1UEAwwHVGVzdCBDQTAeFw0xNTAxMDYyMTI1NDhaFw00NTAyMTcyMTI1
NDhaMB8xCzAJBgNVBAYTAlVTMRAwDgYDVQQDDAdUZXN0IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAls4PO0TAr6TqYU+sVgPhHoQ66wbeFINZvXit
VqzK69RDwkReBvQmtF1+jmAOi0ezNrEW917dVGrSak1uRKotfue01qy4H1R8vUUs
F1Hua38iMe7nzqYNclaehfOvEDOXIXZ7MO2EDcwlBzv6AejmKEw2p6mMn4pc2RT3
glisfJvUZ9Xp6aAmCFES1jeGMn8qaOpqjxurQnS2HICfyM1zAStXUnl8Ax73LCdo
8jCkbhzG29jJII+IQmcqGwJLcOdf+OG7MVtDgFXjf48bf+Cl8/QnecVwWFiCWahL
vAQBXBhBigVqd0YSE9vsNyEVuM1fYdpZxN54nnsnxRhmDgN35wIDAQABMA0GCSqG
SIb3DQEBBQUAA4IBAQA9Ay5J6b8VAxSBWsG8MOuf7fI8iAp6Y4r9dszN7OOD9My1
St2mrKel/Ezo9Wm8dnoUkyeHGDaU684Y9Ix7fFEWHkZBkJKSc+eEhcnhxYOZvUAX
9LX5MmfIKJipClj57DPL08Hrq86dByTzIW82S82F6xzZeY5HTsHrVswZWXsBewHQ
NNk22p7Pz+lErHpfdSpzFGAgD0+2jOJjqtmHA/JO5jsOjLv02wzgPsP4VCQAWRfW
dfU+YY4g0DKsvgK4Rz2Ay59789XWonGJ31YNDvAHwyyd1F7295ZPApEjH+QggMCe
lVnIS3Tj4b98pRl2czyOr7Y+bq1EpX0Gr4nch9yc
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAls4PO0TAr6TqYU+sVgPhHoQ66wbeFINZvXitVqzK69RDwkRe
BvQmtF1+jmAOi0ezNrEW917dVGrSak1uRKotfue01qy4H1R8vUUsF1Hua38iMe7n
zqYNclaehfOvEDOXIXZ7MO2EDcwlBzv6AejmKEw2p6mMn4pc2RT3glisfJvUZ9Xp
6aAmCFES1jeGMn8qaOpqjxurQnS2HICfyM1zAStXUnl8Ax73LCdo8jCkbhzG29jJ
II+IQmcqGwJLcOdf+OG7MVtDgFXjf48bf+Cl8/QnecVwWFiCWahLvAQBXBhBigVq
d0YSE9vsNyEVuM1fYdpZxN54nnsnxRhmDgN35wIDAQABAoIBACtANgYdldXKSp5W
J2sT+cCy0+MMOS1Q7q/0qGIvdJNmcXiJ+x2rcF5SYjWbPxCbI78P0zJnNrs7V9W9
F18CH8JB2g+nwbbamFwANsEJcoPKFpiTmFAgN8MPLK/mT9MpuLKUNIi31iPO5N/K
R828aiYslZBIhFhNaouoA8SSggXKis9XAmXr/pZihMCifw8NCaCsc4CwKGOYPe2J
7xjEnMl/ENN3hCTSFaCo4VPSAgzr+1QnnsKJdFqFefe/iTF+6/DLs2ewlIJjMYPf
/TnCDsUPS25UnfTiWmhn2/qwTL171NBGRheDourceMyeQ0ZY+as5G0Ey2qhrSjxB
j3GpAoECgYEAxgAMZoApi0GLuONTo3qXxCCAUIF14W2CTxYpcc4Qm+LnuTZ4dGfO
v7DEtDX3g62B7c3p8+tejCdt2SSho4LFrLLHWT+wL+Mbk5ec5bWYsTUNcHuy/+SF
xMgo3VQV1ba9LsnX5DB4PJxdHf7l6X1x0lzGiEOcBwlqyF1hGRBepzcCgYEAwvrb
hb3tvqVqDh/mjy4RqqGtp3ePi8hocGztevoWfh/KpB9EpPB9PPJxqS0PQxbRisPo
zOXBzo+JFNrKVW8VXkoVv8QtjX/QE/23rxe02o2RqlS/oFHS2+4w+a0BvImeKTHj
rB2YB3/kvdxkJJitiuR19P6IuXNsaDyuCxS8rNECgYEAuwPeso4JL1QIsehd3oJz
iLceG2w8OGFj/Gk1Wh3FiEfokQMHAQPvvxUqpgB3ObOPjlq4yEAfPIgddETqO3PQ
XA88xWqncoOzT1ObyUgd4fr3J7Be4N4rDzPzjSHXwdVpmSDivtCdMLqMJUHWTRTE
hmpExv39CJR3fKrehHr2vD8CgYEAls708DMBKk5DA33FFMWrQHEhIcCmNJXjweFe
pZm9v/vS/rJ4o6KnG3biVtnVTizeEhiJfcHP73axroGzsfTjcDSZMeQI38MWLAA4
DKOnbMvG+RnnxZbEIvvOwa8BAtTmkjJWSI/zQQm44OkQRAYbZKxkWARvuBEArncQ
nt2BOaECgYAi8czIWNcUDatGLwsg+niIshoTv33FNbkklAxdXd7JLOYRLElT38WP
89WqyGKTycZ+L7CHDZhWzMDp2H+V46Vq8meEQcvNcS6u7xIJgpVzzGRfBAiXgDmz
sJmXc4Emy11uqpKTufDsyVfo6sZNLHhu4Lhzg88rpr/bb2phBv8wsQ==
-----END RSA PRIVATE KEY-----
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment