--- /dev/null
+#!/bin/bash
+
+
+echo "gen ca..."
+
+openssl genrsa -out ca_priv.pem 4096
+
+openssl rsa -in ca_priv.pem -outform PEM -pubout -out ca_pub.pem
+
+openssl req -x509 -new -key ca_priv.pem -days 365 -out ca.crt.pem -subj "/CN=testca"
+
+
+echo "gen server..."
+
+openssl genrsa -out server_priv.pem 4096
+
+openssl rsa -in server_priv.pem -outform PEM -pubout -out server_pub.pem
+
+openssl req -key server_priv.pem -new -sha256 -out server.csr -subj "/CN=server.test"
+
+echo "signing server..."
+
+openssl x509 -req -extfile <(printf "subjectAltName = DNS:server.test") -days 180 -in server.csr -CA ca.crt.pem -CAkey ca_priv.pem -CAcreateserial -sha256 -out server.crt.pem
+
+
+echo "gen sub1..."
+
+openssl genrsa -out sub_priv1.pem 4096
+
+openssl rsa -in sub_priv1.pem -outform PEM -pubout -out sub_pub1.pem
+
+openssl req -key sub_priv1.pem -new -sha256 -out sub1.csr -subj "/CN=sub1.test"
+
+echo "gen sub2..."
+
+openssl genrsa -out sub_priv2.pem 4096
+
+openssl rsa -in sub_priv2.pem -outform PEM -pubout -out sub_pub2.pem
+
+openssl req -key sub_priv2.pem -new -sha256 -out sub2.csr -subj "/CN=sub2.test"
+
+echo "signing sub1..."
+
+openssl x509 -req -extfile <(printf "subjectAltName = DNS:sub1.test") -days 180 -in sub1.csr -CA ca.crt.pem -CAkey ca_priv.pem -CAcreateserial -sha256 -out sub1.crt.pem
+
+echo "signiing sub2..."
+
+openssl x509 -req -extfile <(printf "subjectAltName = DNS:sub2.test") -days 180 -in sub2.csr -CA ca.crt.pem -CAkey ca_priv.pem -CAcreateserial -sha256 -out sub2.crt.pem
+
+
+/bin/cp -Rf *.pem ../tls/
+
+rm -rf *.pem *.srl *.csr
\ No newline at end of file
#define HUB_BODY_BYTELEN HUB_WORD * 1
#define HUB_BODY_BYTEMAX HUB_WORD * 1280 //10KB
#define HUB_TIMEOUT_MS 5000
+
#define HUB_HEADER_AUTHSOCK "AUTHSOCK"
+#define HUB_HEADER_REGSOCK_CREATE "REGSOCK_CREATE"
+#define HUB_HEADER_REGSOCK_JOIN "REGSOCK_JOIN"
+
+
#define HUB_HEADER_AUTHFRONT "AUTHFRONT"
#define HUB_HEADER_AUTHFRANK "AUTHFRANK"
#define HUB_HEADER_SENDSOCK "SENDSOCK"
#define HUB_HEADER_SENDFRANK "SENDFRANK"
#define HUB_HEADER_RECVFRANK "RECVFRANK"
+
+
#define TRUE 1
#define FALSE 0
#define MAX_BUFF HUB_BODY_BYTEMAX
#endif
#ifndef SERVER_KEY
-# define SERVER_KEY "tls/sub_priv.pem"
+# define SERVER_KEY "tls/server_priv.pem"
#endif
#ifndef SERVER_CERT
-# define SERVER_CERT "tls/sub.crt"
+# define SERVER_CERT "tls/server.crt.pem"
#endif
#ifndef HUB_CA_CERT
char pw[MAX_PW_LEN];
SSL *ssl;
SSL_CTX *ctx;
+ int fd_ptr;
int fds[MAX_CONN];
- SSL *ssls[MAX_CONN];
- SSL_CTX *ctxs[MAX_CONN];
+
};
struct SOCK_CONTEXT {
SSL *ssl;
SSL_CTX *ctx;
char id[MAX_ID_LEN];
-
+ int chan_idx;
};
int update_chanctx_from_sockctx(int fd, char* id);
-int get_chanctx_by_id(char* id);
-int get_chanctx_by_fd(int fd, int type);
int set_sockctx_by_fd(int fd);
int get_sockctx_by_fd(int fd);
+int set_sockctx_id_by_fd(int fd, char* id);
+
+int get_sockctx_id_by_fd(int fd, char* id);
+
+int set_chanctx_by_id(char* id, int create, int fd);
+
+int get_chanctx_by_id(char* id);
+
+int set_sockctx_chan_id_by_fd(int fd, int chan_id);
+
+int get_sockctx_chan_id_by_fd(int fd);
+
int calloc_chanctx();
void sock_authenticate(int cfd);
-void sock_communicate(int chan_idx);
+void sock_register(int cfd);
+
+void sock_communicate(int chan_idx, int sock_idx);
#endif
\ No newline at end of file
}
-int get_chanctx_by_id(char* id){
+
+
+
+
+int set_sockctx_by_fd(int fd){
+
+
+ int new_idx = calloc_sockctx();
+
+ if(new_idx < 0){
+
+
+ return -1;
+
+ }
+
+ SOCK_CTX[new_idx].sockfd = fd;
+
+ return new_idx;
+}
+
+
+
+
+int get_sockctx_by_fd(int fd){
for(int i = 0; i < MAX_CONN; i++){
- if(strcmp(CHAN_CTX[i].id, id) == 0){
+
+ if(SOCK_CTX[i].sockfd == fd){
return i;
}
+
}
+
return -1;
}
+int set_sockctx_id_by_fd(int fd, char* id){
-int get_chanctx_by_fd(int fd, int type){
+ int idx = get_sockctx_by_fd(fd);
+ if(idx < 0){
- if(type == ISSOCK){
+ return -1;
+ }
+
+ memcpy(SOCK_CTX[idx].id, id, MAX_ID_LEN);
- for(int i = 0; i < MAX_CONN; i++){
+ return 0;
+}
- if(CHAN_CTX[i].sockfd == fd){
+int get_sockctx_id_by_fd(int fd, char* id){
- return i;
- }
- }
+ int idx = get_sockctx_by_fd(fd);
+ if(idx < 0){
+ return -1;
}
+ memcpy(id, SOCK_CTX[idx].id, MAX_ID_LEN);
+ return 0;
- return -1;
}
+int set_chanctx_by_id(char* id, int create, int fd){
+ int idx = get_chanctx_by_id(id);
+ if(create == 1){
-int set_sockctx_by_fd(int fd){
+ if(idx < 0){
+ idx = calloc_chanctx();
- int new_idx = calloc_sockctx();
+ memcpy(CHAN_CTX[idx].id, id, MAX_ID_LEN);
- if(new_idx < 0){
+ CHAN_CTX[idx].fds[CHAN_CTX[idx].fd_ptr] = fd;
+ CHAN_CTX[idx].fd_ptr += 1;
+
+ } else {
+
+ return -1;
+ }
+
+
+ } else {
+
+
+ if(idx < 0){
+
+ return -2;
+
+ } else {
+
+ CHAN_CTX[idx].fds[CHAN_CTX[idx].fd_ptr] = fd;
+ CHAN_CTX[idx].fd_ptr += 1;
+ }
- return -1;
}
- SOCK_CTX[new_idx].sockfd = fd;
- return new_idx;
-}
+ return idx;
+}
-int get_sockctx_by_fd(int fd){
+int get_chanctx_by_id(char* id){
for(int i = 0; i < MAX_CONN; i++){
-
- if(SOCK_CTX[i].sockfd == fd){
+ if(strcmp(CHAN_CTX[i].id, id) == 0){
return i;
}
+ }
+
+
+ return -1;
+}
+
+
+int set_sockctx_chan_id_by_fd(int fd, int chan_id){
+
+
+ int idx = get_sockctx_by_fd(fd);
+
+ if(idx < 0){
+
+ return -1;
}
+ SOCK_CTX[idx].chan_idx = chan_id;
+ return 0;
- return -1;
}
+int get_sockctx_chan_id_by_fd(int fd){
+
+
+ int idx = get_sockctx_by_fd(fd);
+
+ if(idx < 0){
+
+ return -1;
+ }
+
+ return SOCK_CTX[idx].chan_idx;
+
+}
+
int calloc_chanctx(){
CHAN_CTX[i].ssl = NULL;
CHAN_CTX[i].ctx = NULL;
+
return i;
}
SOCK_CTX[i].ctx = NULL;
SOCK_CTX[i].ssl = NULL;
SOCK_CTX[i].sockfd = 0;
+ SOCK_CTX[i].chan_idx = -1;
SOCK_CTX[i].allocated = 1;
int valwrite = 0;
- if(hp->ctx_type == CHAN_ISSOCK){
-
-
- valwrite = chanctx_write(ISSOCK, hp->id, HUB_HEADER_BYTELEN, hp->header);
-
- if(valwrite <= 0){
-
- printf("packet send header failed\n");
-
- hp->flag = valwrite;
-
- return;
-
- }
-
- uint8_t body_len_byte[HUB_BODY_BYTELEN] = {0};
-
- uint64_t body_len_new = 0;
-
- body_len_new = htonll(hp->body_len);
-
-
- memcpy(body_len_byte, &body_len_new, HUB_BODY_BYTELEN);
-
-
- valwrite = chanctx_write(ISSOCK, hp->id, HUB_BODY_BYTELEN, body_len_byte);
-
- if(valwrite <= 0){
-
- printf("packet send body len failed\n");
-
- hp->flag = valwrite;
-
- return;
-
- }
-
- valwrite = chanctx_write(ISSOCK, hp->id, hp->body_len, hp->wbuff);
-
-
- if(valwrite <= 0){
-
- printf("packet send buff failed\n");
-
- hp->flag = valwrite;
-
- return;
-
- }
-
- hp->flag = valwrite;
-
- return;
-
-
- }
-
-
if(hp->ctx_type == ISSOCK){
valwrite = sockctx_write(hp->fd, HUB_HEADER_BYTELEN, hp->header);
int valread = 0;
- if(hp->ctx_type == CHAN_ISSOCK){
-
- valread = chanctx_read(ISSOCK, hp->id, HUB_HEADER_BYTELEN, hp->header);
-
- if(valread <= 0){
-
- printf("packet recv header failed\n");
-
- hp->flag = valread;
-
- return;
-
- }
-
- uint8_t body_len_byte[HUB_BODY_BYTELEN] = {0};
-
- uint64_t body_len = 0;
-
- valread = chanctx_read(ISSOCK, hp->id, HUB_BODY_BYTELEN, body_len_byte);
-
-
- if(valread <= 0){
-
- printf("packet recv body len failed\n");
-
- hp->flag = valread;
-
- return;
-
- }
-
- memcpy(&body_len, body_len_byte, HUB_BODY_BYTELEN);
-
- body_len = ntohll(body_len);
-
- if(body_len > HUB_BODY_BYTEMAX){
-
- printf("packet body len too long \n");
-
- hp->flag = -10;
-
- return;
- }
-
- hp->body_len = body_len;
-
- hp->rbuff = (uint8_t*)malloc(hp->body_len * sizeof(uint8_t));
-
- memset(hp->rbuff, 0, hp->body_len * sizeof(uint8_t));
-
- valread = chanctx_read(ISSOCK, hp->id, hp->body_len, hp->rbuff);
-
- if(valread <= 0){
-
- printf("packet recv body failed\n");
-
- free(hp->rbuff);
-
- hp->flag = valread;
-
- return;
-
- }
-
-
- hp->flag = valread;
-
- return;
-
-
- }
-
-
-
-
-
if(hp->ctx_type == ISSOCK){
valread = sockctx_read(hp->fd, HUB_HEADER_BYTELEN, hp->header);
pthread_mutex_lock(&G_MTX);
- int chan_idx = get_chanctx_by_fd(cfd, ISSOCK);
+ int sock_idx = get_sockctx_by_fd(cfd);
- if(chan_idx < 0){
+ if(sock_idx < 0){
sock_authenticate(cfd);
return;
}
- sock_communicate(chan_idx);
+ int chan_idx = get_sockctx_chan_id_by_fd(cfd);
+
+ if(chan_idx < 0){
+
+ sock_register(cfd);
+
+ pthread_mutex_unlock(&G_MTX);
+
+ return;
+ }
+
+ sock_communicate(chan_idx, sock_idx);
pthread_mutex_unlock(&G_MTX);
int sock_idx = get_sockctx_by_fd(cfd);
- fmt_logln(LOGFP,"not registered to chan ctx, auth");
+ fmt_logln(LOGFP,"not registered to sock ctx, auth");
if(sock_idx < 0){
+ if(strcmp(hp.header, HUB_HEADER_AUTHSOCK) != 0){
+
+ fmt_logln(LOGFP,"not authenticate header: %s", hp.header);
+
+ free_sockctx(sock_idx, 1);
+
+ return;
+
+ }
+
+
int verified = sig_verify(hp.rbuff, CA_CERT);
if(verified < 1){
- int ret_cn = extract_common_name(id, hp.rbuff);
+ int ret = extract_common_name(id, hp.rbuff);
- if(ret_cn != 1){
+ if(ret != 1){
fmt_logln(LOGFP,"invalid id");
free(hp.rbuff);
+ ret = set_sockctx_id_by_fd(cfd, id);
+
+ if (ret < 0){
+
+ fmt_logln(LOGFP, "failed to set sockctx");
+
+ free_sockctx(sock_idx, 1);
+
+ free(hp.rbuff);
+
+ return;
+
+ }
+
+ /*
+
int chan_idx = update_chanctx_from_sockctx(cfd, id);
if (chan_idx < 0){
}
+ */
uint64_t body_len = strlen("SUCCESS") + 1;
memset(hp.header, 0, HUB_HEADER_BYTELEN);
}
- fmt_logln(LOGFP, "sent");
+ fmt_logln(LOGFP, "auth success sent");
return;
}
+void sock_register(int cfd){
+
+
+ int valread;
+ int valwrite;
+
+ int result;
+
+ int is_create;
+
+ struct HUB_PACKET hp;
+
+
+ uint8_t id[MAX_ID_LEN] = {0};
+
+ int sock_idx = get_sockctx_by_fd(cfd);
+
+ fmt_logln(LOGFP,"not registered to sock ctx, auth");
+
+ if(sock_idx < 0){
+
+ fmt_logln(LOGFP,"failed to get sock idx");
+
+ return;
+ }
-void sock_communicate(int chan_idx){
- fmt_logln(LOGFP, "incoming sock communication to front");
+ hp.ctx_type = ISSOCK;
+ hp.fd = SOCK_CTX[sock_idx].sockfd;
+
+ ctx_read_packet(&hp);
+
+ if(hp.flag <= 0){
- int frontfd = CHAN_CTX[chan_idx].frontfd;
- if(frontfd == 0){
+ fmt_logln(LOGFP,"failed to read sock");
- fmt_logln(LOGFP, "no front exists for communication");
+ free_sockctx(sock_idx, 1);
return;
}
- fmt_logln(LOGFP, "front exists");
- struct HUB_PACKET hp;
+ if(strcmp(hp.header, HUB_HEADER_REGSOCK_CREATE) == 0){
+
+ is_create = 1;
+
+ memcpy(id, hp.rbuff, MAX_ID_LEN);
+
+ result = set_chanctx_by_id(id, 1, cfd);
+
+ } else if (strcmp(hp.header, HUB_HEADER_REGSOCK_JOIN) == 0){
+
+ is_create = 0;
+
+ memcpy(id, hp.rbuff, MAX_ID_LEN);
+
+ result = set_chanctx_by_id(id, 0, cfd);
+
+ } else {
+
+ fmt_logln(LOGFP,"not register header: %s", hp.header);
+
+ free_sockctx(sock_idx, 1);
+
+ return;
+
+ }
+
+
+ if (result < 0){
+
+ fmt_logln(LOGFP,"failed to register: result: %d", result);
+
+ free_sockctx(sock_idx, 1);
+
+ return;
+ }
+
+
+ uint64_t body_len = strlen("SUCCESS") + 1;
+
+ memset(hp.header, 0, HUB_HEADER_BYTELEN);
+
+ memset(hp.wbuff, 0, MAX_BUFF);
hp.ctx_type = CHAN_ISSOCK;
- strcpy(hp.id, CHAN_CTX[chan_idx].id);
+ if(is_create == 1){
+
+ strcpy(hp.header, HUB_HEADER_REGSOCK_CREATE);
+
+ } else {
+
+ strcpy(hp.header, HUB_HEADER_REGSOCK_JOIN);
+ }
+
+
+ hp.body_len = body_len;
+
+ strcat(hp.wbuff,"SUCCESS");
+
+ strcpy(hp.id, id);
+
+ fmt_logln(LOGFP, "writing auth result..");
+
+ ctx_write_packet(&hp);
+
+ if(hp.flag <= 0){
+
+ fmt_logln(LOGFP, "failed to send");
+
+ return;
+
+ }
+
+ fmt_logln(LOGFP, "register success sent");
+
+ return;
+
+}
+
+
+void sock_communicate(int chan_idx, int sock_idx){
+
+ fmt_logln(LOGFP, "incoming sock communication ");
+
+
+ struct HUB_PACKET hp;
+
+ hp.ctx_type = ISSOCK;
+
+ hp.fd = SOCK_CTX[sock_idx].sockfd;
ctx_read_packet(&hp);
memset(hp.wbuff, 0, MAX_BUFF);
- hp.ctx_type = CHAN_ISFRONT;
+ hp.ctx_type = ISSOCK;
- strcpy(hp.header, HUB_HEADER_RECVFRONT);
+ //strcpy(hp.header, HUB_HEADER_RECVFRONT);
strncpy(hp.wbuff, hp.rbuff, hp.body_len);
free(hp.rbuff);
- ctx_write_packet(&hp);
+ int counter = CHAN_CTX[chan_idx].fd_ptr;
- if(hp.flag <= 0){
+ for(int i = 0; i < counter; i++){
- fmt_logln(LOGFP, "failed to send to front");
+ hp.fd = CHAN_CTX[chan_idx].fds[i];
+
+ ctx_write_packet(&hp);
+
+ if(hp.flag <= 0){
+
+ fmt_logln(LOGFP, "failed to send to peer: %d", i);
+
+ continue;
+ }
+ }
- return;
- }
- fmt_logln(LOGFP, "send to front");
+ fmt_logln(LOGFP, "sent to peer");
return;
}
\ No newline at end of file
+++ /dev/null
------BEGIN CERTIFICATE-----
-MIIFFTCCAv2gAwIBAgIUKEjIY8AOTELEiqp/Rx/zYdclnVcwDQYJKoZIhvcNAQEL
-BQAwGjEYMBYGA1UEAwwPY2FAZmVlYmRhZWQueHl6MB4XDTI0MDUwNDAyMDUxOVoX
-DTM0MDUwMjAyMDUxOVowGjEYMBYGA1UEAwwPY2FAZmVlYmRhZWQueHl6MIICIjAN
-BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuiTwW9Fkha7BNq/tF+ZRePIvlDBw
-h/div9RmCbneMdd1qot5iuS2BXpuzVLlSwKEKoUntRSfIjRj2Q3NDJ95XGocsCuT
-Prj8Bt1t+Kwr5NwyOn1ea6mXMJnMqRlnQznDDWVj+/mVXdJzBc175viToCWk8F/b
-RyJhYQVUL8xXu+CiNQCkRuzdo6UBfTQBlpdoN0x44w5Td083En548qn4jAOhO+mw
-mrO8+WsAyMPNFBLNEXBKF1PN3nC7ryySRLlE/rxnDGxSShjDI0ItgNTFr6rhUenK
-d6n/czM72WdUkHPLPIEO6DN+EDfCPMl9gz/gy3Zrfxg/nuEwrV7GtT69+5diesSt
-AJ2BRUScF1RKVevuzOGB3w2SSiZO4CbxYvvwYQA0MLE9Uhvexkq1xGkkgEqOaFHd
-w3EoTT+Q7JXgA70vGXhp0tOMtkYSGN84gBvXZbB9g7gpZbaZe7L0Mn3tBqqWjEcF
-OdrquXyfP2/9dbCAnL6AVitGZ74UKbV4U1TxW//+ysDt6h3ns3M+y5krFdVe/FkY
-XIyzTJyyqZqtrqX8xG2F72KFCQ0lBTtQm664rufa7UoVE32Lt6b2GasHn8dJVDbj
-i06p07BHkiLNf3YbGPSebh3Sm258LaY+eTK/R/y/hRjxyDAka9ng8eps1m3vdewd
-4SCmLD1ou3b6rxsCAwEAAaNTMFEwHQYDVR0OBBYEFBgBUQHuYfawyeL0Z7ymU4QE
-jcylMB8GA1UdIwQYMBaAFBgBUQHuYfawyeL0Z7ymU4QEjcylMA8GA1UdEwEB/wQF
-MAMBAf8wDQYJKoZIhvcNAQELBQADggIBACf3RPLAjt+DAijU5YG41E0KZ5lQj3PT
-wla+5PB/8avVjgKvP1mkcGhYEq75DRT1T9MdnPRKUCqZCcRUb2nPQCaq/jNSOdbs
-OnlM9qJTZJezwOthUMCNwBMLJJbvTBBrLyaRXaCHN1wcfavIyGMCrqVKW0FfwhaF
-UgwAhG4maTw283lq+/j/9xoPuP7XHkbkRDW3TINS0dEQM1RNNKPVdyMOErKLNBaT
-9DRFWKjRXk2ZtBJ1XxAyT9LipfUVYgjETX/iVV3kknsngM2rtMpjb6W+9f7pfOuh
-gUacxpLflBVkzXYFgsLm6p+wg0l9V3zuaEZELIo2KgcT1jwpBgXvjtye5urKElkh
-JHr07raS8JFrF+L8lcjaXhb28lLDp4fRT8GHEl1/naASVvtZxlEEXnnrkJ6A0jD0
-Vt8balZMYZDoq+A4iYPk6LlHgsYOOnH87L7dhqED+xAZm6fzDZyilUioTVtmIOsC
-5/ybtUdYrK1n9PqfhA/awYYW2vY7M3HFkEjy+gf3VOcdFzpssSUJmyt359B/VRDR
-V5ISq4JA5CyoO/2yKbLEiKW7kY8DiiQjKQ+27zB+KUB0yVSO+xb1dm93zOE29yql
-3cQgBN2CW13Xe/rMNdu53ToE0FIwheRBXtiPsh+bw7MDUStbgIOz/mAszWcbLcai
-ZVo3eVTwCWoN
------END CERTIFICATE-----
+++ /dev/null
------BEGIN CERTIFICATE-----
-MIIEwzCCAqsCFGJACNTxHt8lNKG5UoBZHFyKF+frMA0GCSqGSIb3DQEBCwUAMBox
-GDAWBgNVBAMMD2NhQGZlZWJkYWVkLnh5ejAeFw0yNDA1MDQwMjA1MjFaFw0yNTA1
-MDQwMjA1MjFaMCIxIDAeBgNVBAMMF3NlYW50eXdvcmtAZmVlYmRhZWQueHl6MIIC
-IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxP8l01USO8HYM9S/5q/9GnJu
-Xdx5dTOG4YpFaQdQ+hUfGaBc76D/FnRQE2XgL6r1DZ4tEwy3BZ1UXr3AiOzKQzse
-l8/E1ChgsF8RPXNNIFjkR9EHSMBjC5Wq6T0ATWG8CR/0I4VD7S3Tdd9caT41RbbJ
-WE3lY9S92hn47X+b6ae48UdMn+d2ZNpCQ22nk7chee/UJhQLTQv69IkvonYPJPP8
-PStkzq72xV8Mj28zU0D+Eua2BvDpA76DO08xPB9BprGgF2aqZ3yI63tFWy+kgEXF
-LPLsU6T+wA05dztewBuCQCdfs1NJWwF3JI2HUfDhRc05IO1aV1I6Dq1W9ZH5EyBz
-tGXOD/+ec46AR8h1gpEgir894MdxdP562y1zShRs8nm0DKjkeewgYQ6+2AaTq+jC
-H020y9nRFNIO4sXntl4xYsRVR9G90PosVbOv95NkgWpGWTW/6BtxjVQ/5iI1w9ae
-DmPD7NqD6cIC53TEPllWr1rv1xwO91ZIzoM/5PgLGBIhwWWXK6BDwVU4YOled0Yd
-jr6me7+95+QrEFK7M+Ar4sBnxSBn2BEc6rGOaeG8TbKBMkt4JQJuwbsIQcAWfQmD
-AGDoCzxT4+Y53Z+Rlc4SUurbPeoFE+1PsmnVyHQSyes29DzPQKUSUO67I36YP7fO
-AWNv/NQew7UzDFJV8kMCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAThTtYGycDU8a
-y50NIuz1laYfHLVRT95LSkzq3qZLiQk4ZEP0nVEEWMueY17ObaQ6WC9EY9r+JqAG
-Ng0eUcchVtQoCveeUjKXVQZNTc1pgW5UVHlfzbxgSlDGWB3wwssywMDeubnToalz
-1ksnBPLX7KWnmZWFCjU7jIBUdy0qYdVRH6IaWuAQZJ41FfszWfRnFAuaQFxnZtkt
-fjanuGYKQophT3tu8yCYFr6YqT44FrQ0DIJHRs5F9jUsg7aQTnWlmhmmDMxoPr0T
-ycObH4ZwHbexqzwJGH/ZoX0Sf/bFmFtf/K3xytt921cxMjF8MpjVIx6NrgSy8Ngr
-gRW+XiNW0aRlimYKu0ES9dhKRywXHH7R22sivRWdDWv1t1lo+Lr5EMTM68sO09+s
-KO6z0OKgyfBT7VHzPAsCo2tPFORBlEkh/siKEWyiMgWYN/3KIQT1HDjObmOyCuxE
-Yz7QuRKrHbkQPKu9zTVa6/stX8X82nSet5JPF/LIO5h+R971gkxIjpKHlBWJlvqw
-22UIkJ1s/05G1YqfRef6ADTWEN8xBWyiIhuIYcly/HI5DjMZ/J3VzSbk/JajSGIc
-lRqrn/I0Lfefb1gKZ9DNydzSIBwtv4jikYaLhov0jugSze8bSKf+ktR30JCXXtv2
-IPXwvSGLSRtzfqlRRu9Lx4RMvzSNY7I=
------END CERTIFICATE-----
+++ /dev/null
------BEGIN CERTIFICATE REQUEST-----
-MIIEZzCCAk8CAQAwIjEgMB4GA1UEAwwXc2VhbnR5d29ya0BmZWViZGFlZC54eXow
-ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDE/yXTVRI7wdgz1L/mr/0a
-cm5d3Hl1M4bhikVpB1D6FR8ZoFzvoP8WdFATZeAvqvUNni0TDLcFnVRevcCI7MpD
-Ox6Xz8TUKGCwXxE9c00gWORH0QdIwGMLlarpPQBNYbwJH/QjhUPtLdN131xpPjVF
-tslYTeVj1L3aGfjtf5vpp7jxR0yf53Zk2kJDbaeTtyF579QmFAtNC/r0iS+idg8k
-8/w9K2TOrvbFXwyPbzNTQP4S5rYG8OkDvoM7TzE8H0GmsaAXZqpnfIjre0VbL6SA
-RcUs8uxTpP7ADTl3O17AG4JAJ1+zU0lbAXckjYdR8OFFzTkg7VpXUjoOrVb1kfkT
-IHO0Zc4P/55zjoBHyHWCkSCKvz3gx3F0/nrbLXNKFGzyebQMqOR57CBhDr7YBpOr
-6MIfTbTL2dEU0g7ixee2XjFixFVH0b3Q+ixVs6/3k2SBakZZNb/oG3GNVD/mIjXD
-1p4OY8Ps2oPpwgLndMQ+WVavWu/XHA73VkjOgz/k+AsYEiHBZZcroEPBVThg6V53
-Rh2OvqZ7v73n5CsQUrsz4CviwGfFIGfYERzqsY5p4bxNsoEyS3glAm7BuwhBwBZ9
-CYMAYOgLPFPj5jndn5GVzhJS6ts96gUT7U+yadXIdBLJ6zb0PM9ApRJQ7rsjfpg/
-t84BY2/81B7DtTMMUlXyQwIDAQABoAAwDQYJKoZIhvcNAQELBQADggIBAJftxdPt
-5rCVHS3SWg7YzlQeHL1pIUtEM+YmK/BMr/3SI3l54CvrVl4yquADa3FUxhwEE9jq
-CguHqj0FxpPX9vyN9YfSUmWbn5zzYyifgkf4VVepDOvUhwl5NmP2HwpjgsV8dIaH
-e84a/V7AWdn3OE6+fZOhDtCeP0sJKQ8NyGGvs/UsAvRE8+JPXnf06P7/aGK5L4Cj
-wZoK6RyaoP0dR1rMZDWKQzd2ObhvffzfSEGdnZUNNSsIiTDktvZx46Yf9ZOxj+UB
-KKbajqB2VvOn10egBQ/VrJ2BimCp4GcPVICaMR65QDVcRPL7xErXMRQ2vWCb8Qep
-SB1Hj8Jji/OcDJO14goMuomnkawpHLiErtlekuKMBD3ILtjbfF73I8YaagmA0IGq
-81gk7W0JG/3VhchHhy3gRVxN3WgEnFFN8pCD5SOr0/diGmpCYoiUzfoC79bH0bIP
-CK2E0af4N4LZ+EXTKyGvCIwjNcMM7wiaJxOtwD5+83KHtkP4kfHklW4AFF9YcCDJ
-oG5V2SG+V7rtERnkTcCbm1NYh6oyB9VGa5bu9ln7MBxmkNjdECr4mklM3tBamvXw
-HZyYGkWzpSo+bA5CbxtEdga9pn4zt/R3sUf04JYIjYEF+XP0mAI4Q6kAHCS/T/hJ
-01UfO+W/ws6BnT1MVBiiglzpkN4S3Dn4jC9Z
------END CERTIFICATE REQUEST-----