├── C_webserver ├── Makefile ├── SSL │ ├── all │ │ ├── ca-cert.pem │ │ ├── ca-cert.srl │ │ ├── ca-key.pem │ │ ├── ca-req.csr │ │ ├── ca.p12 │ │ ├── client-cert.pem │ │ ├── client-key.pem │ │ ├── client-req.csr │ │ ├── client.p12 │ │ ├── server-cert.pem │ │ ├── server-key.pem │ │ ├── server-req.csr │ │ └── server.p12 │ ├── ca │ │ ├── ca-cert.pem │ │ ├── ca-cert.srl │ │ ├── ca-key.pem │ │ ├── ca-req.csr │ │ └── ca.p12 │ ├── client_ip │ │ ├── client-cert.pem │ │ ├── client-key.pem │ │ ├── client-req.csr │ │ └── client.p12 │ ├── server │ │ ├── server-cert.pem │ │ ├── server-key.pem │ │ ├── server-req.csr │ │ └── server.p12 │ └── server_domain │ │ ├── server-cert.pem │ │ ├── server-key.pem │ │ ├── server-req.csr │ │ └── server.p12 ├── files │ ├── favicon.ico │ ├── index.html │ ├── snow.jpg │ ├── upload.txt │ ├── uploaderr.txt │ └── weed.jpg ├── http │ ├── Http.c │ ├── SSL.c │ ├── SSL │ │ ├── all │ │ │ ├── ca-cert.pem │ │ │ ├── ca-cert.srl │ │ │ ├── ca-key.pem │ │ │ ├── ca-req.csr │ │ │ ├── ca.p12 │ │ │ ├── client-cert.pem │ │ │ ├── client-key.pem │ │ │ ├── client-req.csr │ │ │ ├── client.p12 │ │ │ ├── server-cert.pem │ │ │ ├── server-key.pem │ │ │ ├── server-req.csr │ │ │ └── server.p12 │ │ ├── ca │ │ │ ├── ca-cert.pem │ │ │ ├── ca-cert.srl │ │ │ ├── ca-key.pem │ │ │ ├── ca-req.csr │ │ │ └── ca.p12 │ │ ├── client_ip │ │ │ ├── client-cert.pem │ │ │ ├── client-key.pem │ │ │ ├── client-req.csr │ │ │ └── client.p12 │ │ ├── server │ │ │ ├── server-cert.pem │ │ │ ├── server-key.pem │ │ │ ├── server-req.csr │ │ │ └── server.p12 │ │ └── server_domain │ │ │ ├── server-cert.pem │ │ │ ├── server-key.pem │ │ │ ├── server-req.csr │ │ │ └── server.p12 │ ├── TCP.c │ ├── WebServer.c │ ├── filesystem.c │ ├── includes │ │ ├── Http.h │ │ ├── SSL.h │ │ ├── TCP.h │ │ ├── WebServer.h │ │ ├── filesystem.h │ │ ├── global.h │ │ ├── pipe.h │ │ ├── request.h │ │ └── response.h │ ├── main.c │ ├── pipe.c │ ├── request.c │ └── response.c └── test ├── LICENSE └── README.md /C_webserver/Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | gcc http/*.c -I http/includes -levent -lssl -lcrypto -o test 3 | clean: 4 | rm test 5 | remove: 6 | rm -r http 7 | rm *.zip 8 | -------------------------------------------------------------------------------- /C_webserver/SSL/all/ca-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDnTCCAoUCFE6LmALvewpst3nJfL070p2PFkR3MA0GCSqGSIb3DQEBCwUAMIGK 3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow 4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE 5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw 6 | MTAyOTA2MzU0OVoXDTMwMTAyNzA2MzU0OVowgYoxCzAJBgNVBAYTAmNuMQ4wDAYD 7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNo 8 | VmlzaW9uMQ0wCwYDVQQLDAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgG 9 | CSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw 10 | ggEKAoIBAQDYa6Ka07ExL3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMy 11 | Cw0SwNR2Ufze+Riys1+ek179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72f 12 | YsAKOdx4SzIGWfdokWpyG61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oE 13 | eibobvXCeoMpfsN7kT9ryN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBy 14 | tuSiIkC6vIONaQzTZ2JnVwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGCl 15 | nU5vTxtxCJmSG6VNndClZomMAn1jJDajAgMBAAEwDQYJKoZIhvcNAQELBQADggEB 16 | AHmTRk1QSZpUhsTLNluH6JiXDq0MyroypPfLhw9DZdh03LA+phGw2Bs9AeWf5qwV 17 | 4Z2txU5FKNyQUODKqC3qtFC8riLqncwhZ87QEEWUuTRWBbpTmsNjZl40Tr0vir9v 18 | WAy7gmke18YfRjdRpep7DDmHb3+PxkllSzKD4N78Ruhm4vIHTagoOiYmkgRMt94W 19 | T7YNI4LE8OGq+5WtXb6V8H5gzoWexBsh87fIJuYpB5xEMnV0BSYVs5Nnlj62qAqq 20 | ijwKav+Nok5PfL5Ozn+aple4UL8tk0qjF6BdFyQPRZ5Iqx5KntMeQ0EhrMMmhhzk 21 | Dv1+KXmmHdU5OaQUpyuDsN0= 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /C_webserver/SSL/all/ca-cert.srl: -------------------------------------------------------------------------------- 1 | 2F82CB83C2A0B4CEC3EB0E0C82923FE9F34E9AA4 2 | -------------------------------------------------------------------------------- /C_webserver/SSL/all/ca-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEowIBAAKCAQEA2GuimtOxMS96IDouMJE7HSimANgf6up0dNdB26cgydzBXrN/ 3 | eH2DMgsNEsDUdlH83vkYsrNfnpNe/UyNiPYHwA4NfsdZWgkjbJQLElaQ0FQCY7KQ 4 | qSe9n2LACjnceEsyBln3aJFqchutcJd+9v4sD86HaKOY05B9yqvbTnblOIeaJRgc 5 | NGOaBHom6G71wnqDKX7De5E/a8jfWTRTK26O9qMopeAdSd53AFjS6tuht87Ad3xS 6 | 3/zAcrbkoiJAuryDjWkM02diZ1cCBFsL9dJz6uOIqKN7vGab/03DTbdzY3ge2INW 7 | TlBgpZ1Ob08bcQiZkhulTZ3QpWaJjAJ9YyQ2owIDAQABAoIBAQCD5HTgboraMtj2 8 | sv5bUub3ykIA2bX58JCwdE8KkjwFSaf/Et1ojPVbliiNeT8CLM0zBhPrNC3d8mo9 9 | bF4FTgtDHE1VKiBmIpOYJFDrCB6RF+Gs6LIIpNOHQyNOGB0ooosGG+YPsC9zAzMc 10 | HvedhyFLMM6NEsaciL5guYOZuhPP8pUzgHlX+QbYi5BSebbxIUtVkExgyLfwTpIO 11 | f79X5pQJa6PKMoApBU+eH+lhH2e4UHYJhxNeqXnxvYBWM01LsPHT+AvEsFqZAotH 12 | R9sPwGvfw+euf51AV5Xe5IIO0judyFe2NRgHNSCJtqFTQrP5c0r+kzg8c44qZe/W 13 | mRDxrFuhAoGBAOypoKYNPuGnfqHsAWg7GDrBDJNxFg57uavljqRAe8l9mf1t8SUs 14 | HKGtCyNKyMqeB+fhREtTTnZvD48B/vdLPr17Ju+kmgf3pMdNG68/xl9WsnjBz0aT 15 | z7saf4olr4aRTZPyBG5w/o1BJhwUwa526sFhalpBQHD/98VKvvfUuZJPAoGBAOoa 16 | mARXRvsQfM8ET8B62F7f5eGu0RNLCMAmFE0pG/kIIEl1yM3Xa+OcEYQIhQdNg5TP 17 | xSNHeimJDdlvTIRIQAbNdVDQX/vzKbPlqJ5frK6dEGBqqpkY+F4Leo8TPH5ygmVf 18 | /cAffC6fGykpvJRocY0b3CSEC+C5LHOEGPBs7KVtAoGAE/6s3PqngmclUsbew5Ci 19 | lmwzBM38IBMh97z4VTZBfx+GgBvm0M4uSRaWp0+tMTkyz8t/eqG6MlVlyh5QDVKl 20 | JVsfSgXtIZkxqckA+sh3mRx5DazKN1tLpLIzbleKweLK3CIJb89KImMLtjmmt3fC 21 | k74IP0HeEO3/YALVqZimaQ8CgYAgsuo84Pv3IYxtVgrVtdL3HYr8hPCLI1XrkOYR 22 | CQbxN+Nan2sW5VoahrgjmxUJuhgA9yxwCxHTL2OR1Wv4pibbTGNwkEp35LUUfaWZ 23 | yX9TPHkHHp8Jl2VJrYzG40b12oTAKDJHXZ543JxsmXnPuO7zaMrNBuypzPOahv78 24 | xhof2QKBgEB5yS0/qH5Y6k8vijLZkwNmp9xgn49H6S4LHy5CHenuAE8DLn1w9RO5 25 | e3GpB58EoqArGxTXrDD1xPnM6X9DDv81KWZkjGJNF75gUs+4w7BfVpdiZ1dNMntY 26 | xC8xpo/1Z2acQ6sSjIGPaTSZP9wCQmCFY+iUaEseZyTjDaWyAzQK 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /C_webserver/SSL/all/ca-req.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC5zCCAc8CAQAwgYoxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG 3 | A1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNoVmlzaW9uMQ0wCwYDVQQL 4 | DAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgGCSqGSIb3DQEJARYLYWZs 5 | eWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYa6Ka07Ex 6 | L3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMyCw0SwNR2Ufze+Riys1+e 7 | k179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72fYsAKOdx4SzIGWfdokWpy 8 | G61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oEeibobvXCeoMpfsN7kT9r 9 | yN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBytuSiIkC6vIONaQzTZ2Jn 10 | VwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGClnU5vTxtxCJmSG6VNndCl 11 | ZomMAn1jJDajAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqGSIb3 12 | DQEBCwUAA4IBAQBcj1wA7gJX/Z8zboNl98h2UMksXgrglnfpoOqo6yJrVNA14GFz 13 | 8gaSRNRaf8M7LFM2SzrAeihC9qzuTHiFt964cqleKpn4s5oYiTuWUzL4bFtDUjD2 14 | qt9iGhObAwbt6i2okMOxPDwkhjBW2hu1sIzXR7Py9dUKPfGmhhyLUs54gTv8Nxo9 15 | hnuDrpMs2wnG9Ky38J8Jis+x7CixCHdGFqGDTN4j8Vjjk6lnwGfcau/kSJFUD9tN 16 | oUAIBw/4RkP+fv8NlKR1oia5L1qmWDSU4wFvv/tPMquVhR/XQsVQKOiaYbnoxbFG 17 | /S+xQCP7WtEoM8Bu54tTSJBFEDzA9omNgKPY 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /C_webserver/SSL/all/ca.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/SSL/all/ca.p12 -------------------------------------------------------------------------------- /C_webserver/SSL/all/client-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDnjCCAoYCFC+Cy4PCoLTOw+sODIKSP+nzTpqkMA0GCSqGSIb3DQEBCwUAMIGK 3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow 4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE 5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw 6 | MTAyOTA2MzgzN1oXDTMwMTAyNzA2MzgzN1owgYsxCzAJBgNVBAYTAmNuMQ4wDAYD 7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo 8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAY 9 | BgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A 10 | MIIBCgKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot38 11 | 3WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX 12 | 4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0i 13 | meECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7X 14 | PH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/m 15 | Wx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABMA0GCSqGSIb3DQEBCwUAA4IB 16 | AQBd9JzeFH9PLRPn5OyTSev4RG89xaq2qWPhOoREU3IDg3/ulGh6geptkfnXXCzA 17 | ZRU8KCKIp01fOhApYzCuxRWkyLTpz6pyO2XyK/dCYw/wVQK/bYnIipHIJVTpmmMy 18 | X6rF1QrhmDu4luWmKwJkkMVDBwTPtsjl0apTaR6jxHHUnP3I8TH/s2GONB+wBMKe 19 | m7L7FWfCdyrLWfKTyGnd8jcW4dqBMlKi9N/B8iFLv8ApKnKnk4lXzO4cC+RS/ohh 20 | z//My1uxt3IdwMQMftjeNryDKzN+1eNcplB6le21bksBd6a60J0Jm97rzTMnyRPe 21 | x5/u67ewVMFW42mvLtuSw/CX 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /C_webserver/SSL/all/client-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEogIBAAKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73 3 | Ot383WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG8 4 | 7kwX4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWM 5 | He0imeECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8 6 | cY7XPH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1 7 | Pu/mWx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABAoIBADzUgXmvV/wWrTQ0 8 | dY9UAIJEKbw7ooiIyjRHAsranjYmyZ2g98uatUXoCUoxTm7MYmXphCXYpqvGpnlX 9 | 4lA9kL9FPiS9ONsULVMrMIwWe16u4vMUlkPxJdhpOzqrBb4crJNXc0aftlKAfEgS 10 | 9fYCUDzFxEkrAlRXCEu8zBjJdXGqTGTJweERnrLMX18lv/IrZxL+6m8C24YMHuFh 11 | NpIVGhtYxTDhUZlVD9dxMvCpBPnENVr7Z8882MpbQORazMKCsL115eunqQcrBEib 12 | 4M1iea89zmsB7eYaah8F6mCz+CLr5IPD7XVK9PGfYEdHHVo6BdsbDL+kdPi3dwT5 13 | 48IIT00CgYEA5P7EZTLTgZuafpBXtRV+xS9kVvP26bI5DOyzsPRoiuIUYKvw/9/+ 14 | fnQxQuJuWsBY6CfHZe6S6mNe4nPqP+1F5aeK2vEF1kvnp4g9L1HQztE4NGIqlj7T 15 | m/sLgQQ9NP6Fb/sv9+JcZ+SN9aEe3o0CaADbIgrbeE5VWVmd7pd9YbcCgYEA3m0d 16 | uP4krvPWFL1wVXLNRZEeElGITskGewKR4eX8Pn90od+g+Vm27qvE8/6Ox0mBsMFt 17 | sfDQaJWqqTdoYiZusJP9L6vbzn50T9/71+D/BOvYaNVr35b4HUJ7WIDmnq+/W2ed 18 | Rx3j124ql8exbs680jznIxj7pIxQdNRLNtfQp6sCgYADxSoInICc9qnhgZDgG119 19 | 85zMTbH4AQYtb0w6EpwSBUzelpYeMFrpTBJvjnjQp7APCnCe/gGPOFmcktn9eXOY 20 | J10C48r7zz4eJQEU4Vz1ur4ZJrCazqf/Pm/fDOnREIuz30fX5fMthrbLn355nYq3 21 | maQB+HnKjkebc/1Eq1vWGwKBgCL7IDiO57AIMzwRyw/1PSlauFMDNZ/GZ9mCvvS7 22 | Gd+uZeZraEKvBGEm7JO/Di9zdQ0abqkUiYJZP3zbdPQyvSfSLniH28rvAlXpkQ8T 23 | mKfqe5+JKS0B7kWTxhhWNW7xjvPOKOMdZU7lSZeTVWlq5DFgWK2haToowyKMnMOk 24 | T3F/AoGAbxm3F6hL8pubyzzF4dMT9CHPEyoiFkRDSFijNKtylqfxGJYcHohMxKp0 25 | 4Hm5xXt2K80Sh3Jx2G1wg/n5kwz/DbYHm6PfgR688o35ZxPf6D2VuO/l7w7qdOTC 26 | gTKWj+uXWjKoWc1rod5ebDm62p9bVZ99weIWG9QHBlfLs+AunGU= 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /C_webserver/SSL/all/client-req.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC6DCCAdACAQAwgYsxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG 3 | A1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE 4 | CwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2Fm 5 | bHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxvaJX7fc 6 | RSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot383WfSv8FaSroDep0ZU890 7 | 2GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX4tusFWQOlF1NQkV1z9H3 8 | UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0imeECc7qQMpxElTkUk3ZI 9 | tMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7XPH8+n2yOzSj7k5tnC0oW 10 | IJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/mWx57Hz1X/iBn1DZNm1cZ 11 | 9MFfl7+8ES6mPQIDAQABoBcwFQYJKoZIhvcNAQkHMQgMBjEyMzQ1NjANBgkqhkiG 12 | 9w0BAQsFAAOCAQEAwkG2tUNkGWXxl4e6u59JfrNdhLTBWnO4wngF6xH64jGcHbEg 13 | Io42yQrBeZ8jmjpGrYbCdNlQqtx5veGgAfOD+wXm4KGJwbAacpBqajCY+orvxy3n 14 | s1h2v3NZ/D+74twsEE8TQeHAq4Z6wqbL4y7SkQnNyaePMHhM6tK1FGnohyUu/bCR 15 | brocrjuc+wsgcvV2m6rLxkO2nLnfAFvzR7iIXobr5dr0OqHYBjbvIBIFRt6YB4cj 16 | m4V7EtKBFxVmL1/Qnim3L7/MqHcG5IEJHu/2GehfXn/7IGE9PvuZlcDeFhGStAn4 17 | DJtLKY4QWrLDWgoZmj5nPNwNZy47gqAsCF2n/Q== 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /C_webserver/SSL/all/client.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/SSL/all/client.p12 -------------------------------------------------------------------------------- /C_webserver/SSL/all/server-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDoDCCAogCFC+Cy4PCoLTOw+sODIKSP+nzTpqjMA0GCSqGSIb3DQEBCwUAMIGK 3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow 4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE 5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw 6 | MTAyOTA2MzcwNFoXDTMwMTAyNzA2MzcwNFowgY0xCzAJBgNVBAYTAmNuMQ4wDAYD 7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo 8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEa 9 | MBgGCSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IB 10 | DwAwggEKAoIBAQDDgXIFJJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewog 11 | ujsEXbFPEzNJb/GAOxwDHppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7Dktn 12 | MJSdNnPqOaD+am+wn7Iw+qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4 13 | a/xn1SwyETPs31fx6mmV01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDL 14 | Ef3dn7ahwpJrvDPSBRCOrw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igw 15 | Oob4Yj/uwCRpOAyzWRLp2oaeg3HtfYDWs2/LAgMBAAEwDQYJKoZIhvcNAQELBQAD 16 | ggEBAKMFHOpoBpHbjpo39iDmaqgpUpkoLUG6MWyxEnugSnDpFnv7bCGX+mzxPYSc 17 | cPtScN3ZKWPNGvGs4W95TxPwHcpQSuQGEQQRATh3lwlvrJSqQrWYjehQT5sMlDrz 18 | ziDrOEN2CGzCE0Arv7DvG1aj9+bjENHpf16sYq2SBB3SIhfEQQ458CnHa5El0HVQ 19 | F8k2hQFym+z4ZZA3CjmiSf8fFgatXplvmQlZfaR98AL1ZBdw9FQMGaBzQ/BZG3Qc 20 | VP9FwfFbyN/w5oB5rGsTty+FQd6XfsAZLaE7yzQqkiXsW6134gap2EmzHXf2QcVV 21 | dUZBz1EtA3HkT5S5kPI5MzGL6Wc= 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /C_webserver/SSL/all/server-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEowIBAAKCAQEAw4FyBSSfIBwVStG8r5Tp/GAy2Ty0BTr4M5AsvubMBhN3BnsK 3 | ILo7BF2xTxMzSW/xgDscAx6aaCTsO2LFOKBL6VvNkn7QHiTEgRQGgFMYnb6mew5L 4 | ZzCUnTZz6jmg/mpvsJ+yMPqg6BcNKB1k54e/wDUBw/pqwUlw9f4ePp7C/Pt5OSWK 5 | OGv8Z9UsMhEz7N9X8eppldNSib3OWKCDLnbRgWZzfo6SkOKV+ImStZwTI2vnfDQg 6 | yxH93Z+2ocKSa7wz0gUQjq8OB77cdJ/SxcIVnjqBW8IaetzDyt04kN8DRjD/5too 7 | MDqG+GI/7sAkaTgMs1kS6dqGnoNx7X2A1rNvywIDAQABAoIBACcqYnYnTP14wsc3 8 | Vy5xjaJyfx1H7ORzWM+znVMtF0hMU/bnZTMDO9l3D5NAzHB0zZObw9PYKKSeaPjI 9 | o6vhaPO54WfsobK4OOmG4nqIqxDG5cEXLwHgGJWaGASfQOJW3kMq6t6nBt8X5xnX 10 | MaS0bDSMKeth2ksYdFnDa7mtwnA9cmvsVUFWH0Kb3GIHEvIkrBW0NySx09Torpua 11 | gPENHC/SLH9Wp2iq0buUbxqZ8zhQd23LUyuuAlzFE+x4gm1ElVWiVfdKoege3kyZ 12 | fWJy1j0ZSQOqbIoBg782R5W21o2i4ZJHm6zyHrxLPpTdgO7n0TA4j3TfIBekKexW 13 | /tBHD0kCgYEA+jTo6E1LxVsK5yt6FkFXFpcmKrH+uPU7c39JWET9AXsU4KVvEAoq 14 | aE7Z9UnBGHf1tU/SZrmqL9mD5KJMZdJiUSAuTmmdE7GITx9O2/wnf3VA+dmHgBQJ 15 | aHyRG/3vNDxOO2HPIjl5hHpawotyqdV/TXOnGkLV2rrkQbHyS1OZPXcCgYEAyAhM 16 | IW180qLjwTdFGrizjsbrsdtUXYxjPoL6YbFgcKNG8MiQzY0rSqZZM8um67qAXCE2 17 | to7ge2xhOPre9n6ARFctAmuQ+EZTcO8Rjd2V+LBYRZqJD/ieA0EnkyV7TE8tF9XD 18 | wYgfIwIdWbPytzrZ1bDzAZMPQo+iqu3IuY2EZU0CgYAZXJGbMnKSv6a8RfDrHpZo 19 | SMvqmf4620i6bVWO5/dJViOIndxDIPSpfAyly2MSSt6SEVQ/a2Rv0zmGTFk4HPow 20 | RPXMpvHwFBfABWll7QpH5ie+66jLd7x4ZeADmVrMzawUYtavHmpN3mUiwSXPRz/P 21 | JwDyLYIl2LnYWuQ3dHLdAwKBgBTU0GDWzx38eq1/fQHYZFKlIpyGE9YeLaOv7jVI 22 | TJvOVS/0IyhU4EJI6pc7SSnZZU6y4sjGPlh8I+/UKG4RJHh5f6V14EYKxNvI+dIF 23 | Vn3sl3TAMC/qm0IJgf6P87Qxtqd5yoYYD+4MZVQXKlqslUzsvZHXZ8ptvOoCE1pH 24 | g5ctAoGBAOTr9bzuXG73yvd8/x84ElqTgc7Fu+RtbEzcNoV+dzZiHXM6/ejb1NjY 25 | mw1ScFEYWSn8EMNd47QjIWHFwEMPQ+uE07ejcIcXEIJNlByBjjCz7A3zu/DoTpnK 26 | EtFdgrjQcMJ6XOYt+jOQAtWZLsxg9LAJ+UxEwNgYXItf9T7tnHs0 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /C_webserver/SSL/all/server-req.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC6jCCAdICAQAwgY0xCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG 3 | A1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE 4 | CwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEaMBgGCSqGSIb3DQEJARYL 5 | YWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDgXIF 6 | JJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewogujsEXbFPEzNJb/GAOxwD 7 | HppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7DktnMJSdNnPqOaD+am+wn7Iw 8 | +qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4a/xn1SwyETPs31fx6mmV 9 | 01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDLEf3dn7ahwpJrvDPSBRCO 10 | rw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igwOob4Yj/uwCRpOAyzWRLp 11 | 2oaeg3HtfYDWs2/LAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqG 12 | SIb3DQEBCwUAA4IBAQBpIJfk4hmga2x+rHmYB0xc6WIvUAblrpkwaaO2k9+ZbeLj 13 | d+8IDWfrA5H5RUQwaI4Q9fmOLTtR2aNMj6OoOCEj/F7DI4MXMr+Z+NA1zLeNla5l 14 | BwX/MYJYP/ElZLb9ygG/wZeoFLnqhz6LW7iJjdB2Vtg6o8goeIpzi1nfYZHc4OnI 15 | y9THVZA3xR7JTBXM7p/K3dBcfYz9H7Uu7CW3v0BnVK1v+Qxa35C+dR3Eug/sdh+j 16 | zPSzxuuPQAYfXSozQgGxN8pNAvOeVzqMVcJNKnkcAr0HOAtvHo1ulmGc2lf8W8b0 17 | ObP19R28lV0vbkK1jkmXvTw80L15kxfhAlyVjyUH 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /C_webserver/SSL/all/server.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/SSL/all/server.p12 -------------------------------------------------------------------------------- /C_webserver/SSL/ca/ca-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDnTCCAoUCFE6LmALvewpst3nJfL070p2PFkR3MA0GCSqGSIb3DQEBCwUAMIGK 3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow 4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE 5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw 6 | MTAyOTA2MzU0OVoXDTMwMTAyNzA2MzU0OVowgYoxCzAJBgNVBAYTAmNuMQ4wDAYD 7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNo 8 | VmlzaW9uMQ0wCwYDVQQLDAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgG 9 | CSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw 10 | ggEKAoIBAQDYa6Ka07ExL3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMy 11 | Cw0SwNR2Ufze+Riys1+ek179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72f 12 | YsAKOdx4SzIGWfdokWpyG61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oE 13 | eibobvXCeoMpfsN7kT9ryN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBy 14 | tuSiIkC6vIONaQzTZ2JnVwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGCl 15 | nU5vTxtxCJmSG6VNndClZomMAn1jJDajAgMBAAEwDQYJKoZIhvcNAQELBQADggEB 16 | AHmTRk1QSZpUhsTLNluH6JiXDq0MyroypPfLhw9DZdh03LA+phGw2Bs9AeWf5qwV 17 | 4Z2txU5FKNyQUODKqC3qtFC8riLqncwhZ87QEEWUuTRWBbpTmsNjZl40Tr0vir9v 18 | WAy7gmke18YfRjdRpep7DDmHb3+PxkllSzKD4N78Ruhm4vIHTagoOiYmkgRMt94W 19 | T7YNI4LE8OGq+5WtXb6V8H5gzoWexBsh87fIJuYpB5xEMnV0BSYVs5Nnlj62qAqq 20 | ijwKav+Nok5PfL5Ozn+aple4UL8tk0qjF6BdFyQPRZ5Iqx5KntMeQ0EhrMMmhhzk 21 | Dv1+KXmmHdU5OaQUpyuDsN0= 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /C_webserver/SSL/ca/ca-cert.srl: -------------------------------------------------------------------------------- 1 | 2F82CB83C2A0B4CEC3EB0E0C82923FE9F34E9AA5 2 | -------------------------------------------------------------------------------- /C_webserver/SSL/ca/ca-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEowIBAAKCAQEA2GuimtOxMS96IDouMJE7HSimANgf6up0dNdB26cgydzBXrN/ 3 | eH2DMgsNEsDUdlH83vkYsrNfnpNe/UyNiPYHwA4NfsdZWgkjbJQLElaQ0FQCY7KQ 4 | qSe9n2LACjnceEsyBln3aJFqchutcJd+9v4sD86HaKOY05B9yqvbTnblOIeaJRgc 5 | NGOaBHom6G71wnqDKX7De5E/a8jfWTRTK26O9qMopeAdSd53AFjS6tuht87Ad3xS 6 | 3/zAcrbkoiJAuryDjWkM02diZ1cCBFsL9dJz6uOIqKN7vGab/03DTbdzY3ge2INW 7 | TlBgpZ1Ob08bcQiZkhulTZ3QpWaJjAJ9YyQ2owIDAQABAoIBAQCD5HTgboraMtj2 8 | sv5bUub3ykIA2bX58JCwdE8KkjwFSaf/Et1ojPVbliiNeT8CLM0zBhPrNC3d8mo9 9 | bF4FTgtDHE1VKiBmIpOYJFDrCB6RF+Gs6LIIpNOHQyNOGB0ooosGG+YPsC9zAzMc 10 | HvedhyFLMM6NEsaciL5guYOZuhPP8pUzgHlX+QbYi5BSebbxIUtVkExgyLfwTpIO 11 | f79X5pQJa6PKMoApBU+eH+lhH2e4UHYJhxNeqXnxvYBWM01LsPHT+AvEsFqZAotH 12 | R9sPwGvfw+euf51AV5Xe5IIO0judyFe2NRgHNSCJtqFTQrP5c0r+kzg8c44qZe/W 13 | mRDxrFuhAoGBAOypoKYNPuGnfqHsAWg7GDrBDJNxFg57uavljqRAe8l9mf1t8SUs 14 | HKGtCyNKyMqeB+fhREtTTnZvD48B/vdLPr17Ju+kmgf3pMdNG68/xl9WsnjBz0aT 15 | z7saf4olr4aRTZPyBG5w/o1BJhwUwa526sFhalpBQHD/98VKvvfUuZJPAoGBAOoa 16 | mARXRvsQfM8ET8B62F7f5eGu0RNLCMAmFE0pG/kIIEl1yM3Xa+OcEYQIhQdNg5TP 17 | xSNHeimJDdlvTIRIQAbNdVDQX/vzKbPlqJ5frK6dEGBqqpkY+F4Leo8TPH5ygmVf 18 | /cAffC6fGykpvJRocY0b3CSEC+C5LHOEGPBs7KVtAoGAE/6s3PqngmclUsbew5Ci 19 | lmwzBM38IBMh97z4VTZBfx+GgBvm0M4uSRaWp0+tMTkyz8t/eqG6MlVlyh5QDVKl 20 | JVsfSgXtIZkxqckA+sh3mRx5DazKN1tLpLIzbleKweLK3CIJb89KImMLtjmmt3fC 21 | k74IP0HeEO3/YALVqZimaQ8CgYAgsuo84Pv3IYxtVgrVtdL3HYr8hPCLI1XrkOYR 22 | CQbxN+Nan2sW5VoahrgjmxUJuhgA9yxwCxHTL2OR1Wv4pibbTGNwkEp35LUUfaWZ 23 | yX9TPHkHHp8Jl2VJrYzG40b12oTAKDJHXZ543JxsmXnPuO7zaMrNBuypzPOahv78 24 | xhof2QKBgEB5yS0/qH5Y6k8vijLZkwNmp9xgn49H6S4LHy5CHenuAE8DLn1w9RO5 25 | e3GpB58EoqArGxTXrDD1xPnM6X9DDv81KWZkjGJNF75gUs+4w7BfVpdiZ1dNMntY 26 | xC8xpo/1Z2acQ6sSjIGPaTSZP9wCQmCFY+iUaEseZyTjDaWyAzQK 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /C_webserver/SSL/ca/ca-req.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC5zCCAc8CAQAwgYoxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG 3 | A1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNoVmlzaW9uMQ0wCwYDVQQL 4 | DAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgGCSqGSIb3DQEJARYLYWZs 5 | eWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYa6Ka07Ex 6 | L3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMyCw0SwNR2Ufze+Riys1+e 7 | k179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72fYsAKOdx4SzIGWfdokWpy 8 | G61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oEeibobvXCeoMpfsN7kT9r 9 | yN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBytuSiIkC6vIONaQzTZ2Jn 10 | VwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGClnU5vTxtxCJmSG6VNndCl 11 | ZomMAn1jJDajAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqGSIb3 12 | DQEBCwUAA4IBAQBcj1wA7gJX/Z8zboNl98h2UMksXgrglnfpoOqo6yJrVNA14GFz 13 | 8gaSRNRaf8M7LFM2SzrAeihC9qzuTHiFt964cqleKpn4s5oYiTuWUzL4bFtDUjD2 14 | qt9iGhObAwbt6i2okMOxPDwkhjBW2hu1sIzXR7Py9dUKPfGmhhyLUs54gTv8Nxo9 15 | hnuDrpMs2wnG9Ky38J8Jis+x7CixCHdGFqGDTN4j8Vjjk6lnwGfcau/kSJFUD9tN 16 | oUAIBw/4RkP+fv8NlKR1oia5L1qmWDSU4wFvv/tPMquVhR/XQsVQKOiaYbnoxbFG 17 | /S+xQCP7WtEoM8Bu54tTSJBFEDzA9omNgKPY 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /C_webserver/SSL/ca/ca.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/SSL/ca/ca.p12 -------------------------------------------------------------------------------- /C_webserver/SSL/client_ip/client-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDnjCCAoYCFC+Cy4PCoLTOw+sODIKSP+nzTpqkMA0GCSqGSIb3DQEBCwUAMIGK 3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow 4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE 5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw 6 | MTAyOTA2MzgzN1oXDTMwMTAyNzA2MzgzN1owgYsxCzAJBgNVBAYTAmNuMQ4wDAYD 7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo 8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAY 9 | BgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A 10 | MIIBCgKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot38 11 | 3WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX 12 | 4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0i 13 | meECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7X 14 | PH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/m 15 | Wx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABMA0GCSqGSIb3DQEBCwUAA4IB 16 | AQBd9JzeFH9PLRPn5OyTSev4RG89xaq2qWPhOoREU3IDg3/ulGh6geptkfnXXCzA 17 | ZRU8KCKIp01fOhApYzCuxRWkyLTpz6pyO2XyK/dCYw/wVQK/bYnIipHIJVTpmmMy 18 | X6rF1QrhmDu4luWmKwJkkMVDBwTPtsjl0apTaR6jxHHUnP3I8TH/s2GONB+wBMKe 19 | m7L7FWfCdyrLWfKTyGnd8jcW4dqBMlKi9N/B8iFLv8ApKnKnk4lXzO4cC+RS/ohh 20 | z//My1uxt3IdwMQMftjeNryDKzN+1eNcplB6le21bksBd6a60J0Jm97rzTMnyRPe 21 | x5/u67ewVMFW42mvLtuSw/CX 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /C_webserver/SSL/client_ip/client-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEogIBAAKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73 3 | Ot383WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG8 4 | 7kwX4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWM 5 | He0imeECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8 6 | cY7XPH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1 7 | Pu/mWx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABAoIBADzUgXmvV/wWrTQ0 8 | dY9UAIJEKbw7ooiIyjRHAsranjYmyZ2g98uatUXoCUoxTm7MYmXphCXYpqvGpnlX 9 | 4lA9kL9FPiS9ONsULVMrMIwWe16u4vMUlkPxJdhpOzqrBb4crJNXc0aftlKAfEgS 10 | 9fYCUDzFxEkrAlRXCEu8zBjJdXGqTGTJweERnrLMX18lv/IrZxL+6m8C24YMHuFh 11 | NpIVGhtYxTDhUZlVD9dxMvCpBPnENVr7Z8882MpbQORazMKCsL115eunqQcrBEib 12 | 4M1iea89zmsB7eYaah8F6mCz+CLr5IPD7XVK9PGfYEdHHVo6BdsbDL+kdPi3dwT5 13 | 48IIT00CgYEA5P7EZTLTgZuafpBXtRV+xS9kVvP26bI5DOyzsPRoiuIUYKvw/9/+ 14 | fnQxQuJuWsBY6CfHZe6S6mNe4nPqP+1F5aeK2vEF1kvnp4g9L1HQztE4NGIqlj7T 15 | m/sLgQQ9NP6Fb/sv9+JcZ+SN9aEe3o0CaADbIgrbeE5VWVmd7pd9YbcCgYEA3m0d 16 | uP4krvPWFL1wVXLNRZEeElGITskGewKR4eX8Pn90od+g+Vm27qvE8/6Ox0mBsMFt 17 | sfDQaJWqqTdoYiZusJP9L6vbzn50T9/71+D/BOvYaNVr35b4HUJ7WIDmnq+/W2ed 18 | Rx3j124ql8exbs680jznIxj7pIxQdNRLNtfQp6sCgYADxSoInICc9qnhgZDgG119 19 | 85zMTbH4AQYtb0w6EpwSBUzelpYeMFrpTBJvjnjQp7APCnCe/gGPOFmcktn9eXOY 20 | J10C48r7zz4eJQEU4Vz1ur4ZJrCazqf/Pm/fDOnREIuz30fX5fMthrbLn355nYq3 21 | maQB+HnKjkebc/1Eq1vWGwKBgCL7IDiO57AIMzwRyw/1PSlauFMDNZ/GZ9mCvvS7 22 | Gd+uZeZraEKvBGEm7JO/Di9zdQ0abqkUiYJZP3zbdPQyvSfSLniH28rvAlXpkQ8T 23 | mKfqe5+JKS0B7kWTxhhWNW7xjvPOKOMdZU7lSZeTVWlq5DFgWK2haToowyKMnMOk 24 | T3F/AoGAbxm3F6hL8pubyzzF4dMT9CHPEyoiFkRDSFijNKtylqfxGJYcHohMxKp0 25 | 4Hm5xXt2K80Sh3Jx2G1wg/n5kwz/DbYHm6PfgR688o35ZxPf6D2VuO/l7w7qdOTC 26 | gTKWj+uXWjKoWc1rod5ebDm62p9bVZ99weIWG9QHBlfLs+AunGU= 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /C_webserver/SSL/client_ip/client-req.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC6DCCAdACAQAwgYsxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG 3 | A1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE 4 | CwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2Fm 5 | bHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxvaJX7fc 6 | RSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot383WfSv8FaSroDep0ZU890 7 | 2GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX4tusFWQOlF1NQkV1z9H3 8 | UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0imeECc7qQMpxElTkUk3ZI 9 | tMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7XPH8+n2yOzSj7k5tnC0oW 10 | IJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/mWx57Hz1X/iBn1DZNm1cZ 11 | 9MFfl7+8ES6mPQIDAQABoBcwFQYJKoZIhvcNAQkHMQgMBjEyMzQ1NjANBgkqhkiG 12 | 9w0BAQsFAAOCAQEAwkG2tUNkGWXxl4e6u59JfrNdhLTBWnO4wngF6xH64jGcHbEg 13 | Io42yQrBeZ8jmjpGrYbCdNlQqtx5veGgAfOD+wXm4KGJwbAacpBqajCY+orvxy3n 14 | s1h2v3NZ/D+74twsEE8TQeHAq4Z6wqbL4y7SkQnNyaePMHhM6tK1FGnohyUu/bCR 15 | brocrjuc+wsgcvV2m6rLxkO2nLnfAFvzR7iIXobr5dr0OqHYBjbvIBIFRt6YB4cj 16 | m4V7EtKBFxVmL1/Qnim3L7/MqHcG5IEJHu/2GehfXn/7IGE9PvuZlcDeFhGStAn4 17 | DJtLKY4QWrLDWgoZmj5nPNwNZy47gqAsCF2n/Q== 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /C_webserver/SSL/client_ip/client.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/SSL/client_ip/client.p12 -------------------------------------------------------------------------------- /C_webserver/SSL/server/server-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDoDCCAogCFC+Cy4PCoLTOw+sODIKSP+nzTpqjMA0GCSqGSIb3DQEBCwUAMIGK 3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow 4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE 5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw 6 | MTAyOTA2MzcwNFoXDTMwMTAyNzA2MzcwNFowgY0xCzAJBgNVBAYTAmNuMQ4wDAYD 7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo 8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEa 9 | MBgGCSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IB 10 | DwAwggEKAoIBAQDDgXIFJJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewog 11 | ujsEXbFPEzNJb/GAOxwDHppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7Dktn 12 | MJSdNnPqOaD+am+wn7Iw+qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4 13 | a/xn1SwyETPs31fx6mmV01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDL 14 | Ef3dn7ahwpJrvDPSBRCOrw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igw 15 | Oob4Yj/uwCRpOAyzWRLp2oaeg3HtfYDWs2/LAgMBAAEwDQYJKoZIhvcNAQELBQAD 16 | ggEBAKMFHOpoBpHbjpo39iDmaqgpUpkoLUG6MWyxEnugSnDpFnv7bCGX+mzxPYSc 17 | cPtScN3ZKWPNGvGs4W95TxPwHcpQSuQGEQQRATh3lwlvrJSqQrWYjehQT5sMlDrz 18 | ziDrOEN2CGzCE0Arv7DvG1aj9+bjENHpf16sYq2SBB3SIhfEQQ458CnHa5El0HVQ 19 | F8k2hQFym+z4ZZA3CjmiSf8fFgatXplvmQlZfaR98AL1ZBdw9FQMGaBzQ/BZG3Qc 20 | VP9FwfFbyN/w5oB5rGsTty+FQd6XfsAZLaE7yzQqkiXsW6134gap2EmzHXf2QcVV 21 | dUZBz1EtA3HkT5S5kPI5MzGL6Wc= 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /C_webserver/SSL/server/server-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEowIBAAKCAQEAw4FyBSSfIBwVStG8r5Tp/GAy2Ty0BTr4M5AsvubMBhN3BnsK 3 | ILo7BF2xTxMzSW/xgDscAx6aaCTsO2LFOKBL6VvNkn7QHiTEgRQGgFMYnb6mew5L 4 | ZzCUnTZz6jmg/mpvsJ+yMPqg6BcNKB1k54e/wDUBw/pqwUlw9f4ePp7C/Pt5OSWK 5 | OGv8Z9UsMhEz7N9X8eppldNSib3OWKCDLnbRgWZzfo6SkOKV+ImStZwTI2vnfDQg 6 | yxH93Z+2ocKSa7wz0gUQjq8OB77cdJ/SxcIVnjqBW8IaetzDyt04kN8DRjD/5too 7 | MDqG+GI/7sAkaTgMs1kS6dqGnoNx7X2A1rNvywIDAQABAoIBACcqYnYnTP14wsc3 8 | Vy5xjaJyfx1H7ORzWM+znVMtF0hMU/bnZTMDO9l3D5NAzHB0zZObw9PYKKSeaPjI 9 | o6vhaPO54WfsobK4OOmG4nqIqxDG5cEXLwHgGJWaGASfQOJW3kMq6t6nBt8X5xnX 10 | MaS0bDSMKeth2ksYdFnDa7mtwnA9cmvsVUFWH0Kb3GIHEvIkrBW0NySx09Torpua 11 | gPENHC/SLH9Wp2iq0buUbxqZ8zhQd23LUyuuAlzFE+x4gm1ElVWiVfdKoege3kyZ 12 | fWJy1j0ZSQOqbIoBg782R5W21o2i4ZJHm6zyHrxLPpTdgO7n0TA4j3TfIBekKexW 13 | /tBHD0kCgYEA+jTo6E1LxVsK5yt6FkFXFpcmKrH+uPU7c39JWET9AXsU4KVvEAoq 14 | aE7Z9UnBGHf1tU/SZrmqL9mD5KJMZdJiUSAuTmmdE7GITx9O2/wnf3VA+dmHgBQJ 15 | aHyRG/3vNDxOO2HPIjl5hHpawotyqdV/TXOnGkLV2rrkQbHyS1OZPXcCgYEAyAhM 16 | IW180qLjwTdFGrizjsbrsdtUXYxjPoL6YbFgcKNG8MiQzY0rSqZZM8um67qAXCE2 17 | to7ge2xhOPre9n6ARFctAmuQ+EZTcO8Rjd2V+LBYRZqJD/ieA0EnkyV7TE8tF9XD 18 | wYgfIwIdWbPytzrZ1bDzAZMPQo+iqu3IuY2EZU0CgYAZXJGbMnKSv6a8RfDrHpZo 19 | SMvqmf4620i6bVWO5/dJViOIndxDIPSpfAyly2MSSt6SEVQ/a2Rv0zmGTFk4HPow 20 | RPXMpvHwFBfABWll7QpH5ie+66jLd7x4ZeADmVrMzawUYtavHmpN3mUiwSXPRz/P 21 | JwDyLYIl2LnYWuQ3dHLdAwKBgBTU0GDWzx38eq1/fQHYZFKlIpyGE9YeLaOv7jVI 22 | TJvOVS/0IyhU4EJI6pc7SSnZZU6y4sjGPlh8I+/UKG4RJHh5f6V14EYKxNvI+dIF 23 | Vn3sl3TAMC/qm0IJgf6P87Qxtqd5yoYYD+4MZVQXKlqslUzsvZHXZ8ptvOoCE1pH 24 | g5ctAoGBAOTr9bzuXG73yvd8/x84ElqTgc7Fu+RtbEzcNoV+dzZiHXM6/ejb1NjY 25 | mw1ScFEYWSn8EMNd47QjIWHFwEMPQ+uE07ejcIcXEIJNlByBjjCz7A3zu/DoTpnK 26 | EtFdgrjQcMJ6XOYt+jOQAtWZLsxg9LAJ+UxEwNgYXItf9T7tnHs0 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /C_webserver/SSL/server/server-req.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC6jCCAdICAQAwgY0xCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG 3 | A1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE 4 | CwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEaMBgGCSqGSIb3DQEJARYL 5 | YWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDgXIF 6 | JJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewogujsEXbFPEzNJb/GAOxwD 7 | HppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7DktnMJSdNnPqOaD+am+wn7Iw 8 | +qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4a/xn1SwyETPs31fx6mmV 9 | 01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDLEf3dn7ahwpJrvDPSBRCO 10 | rw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igwOob4Yj/uwCRpOAyzWRLp 11 | 2oaeg3HtfYDWs2/LAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqG 12 | SIb3DQEBCwUAA4IBAQBpIJfk4hmga2x+rHmYB0xc6WIvUAblrpkwaaO2k9+ZbeLj 13 | d+8IDWfrA5H5RUQwaI4Q9fmOLTtR2aNMj6OoOCEj/F7DI4MXMr+Z+NA1zLeNla5l 14 | BwX/MYJYP/ElZLb9ygG/wZeoFLnqhz6LW7iJjdB2Vtg6o8goeIpzi1nfYZHc4OnI 15 | y9THVZA3xR7JTBXM7p/K3dBcfYz9H7Uu7CW3v0BnVK1v+Qxa35C+dR3Eug/sdh+j 16 | zPSzxuuPQAYfXSozQgGxN8pNAvOeVzqMVcJNKnkcAr0HOAtvHo1ulmGc2lf8W8b0 17 | ObP19R28lV0vbkK1jkmXvTw80L15kxfhAlyVjyUH 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /C_webserver/SSL/server/server.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/SSL/server/server.p12 -------------------------------------------------------------------------------- /C_webserver/SSL/server_domain/server-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDpjCCAo4CFC+Cy4PCoLTOw+sODIKSP+nzTpqlMA0GCSqGSIb3DQEBCwUAMIGK 3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow 4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE 5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw 6 | MTAyOTA4MzgzMFoXDTMwMTAyNzA4MzgzMFowgZMxCzAJBgNVBAYTAkNOMQ4wDAYD 7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo 8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEcMBoGA1UEAwwTd3d3LmFmbHlpbmdmaXNo 9 | LmNvbTEaMBgGCSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEB 10 | AQUAA4IBDwAwggEKAoIBAQC/JgIC+GtfR/vDegZskJGEVi1uCPKzcn62WJh7/Ixn 11 | wvkzmbp21BlCeDerQVQus5Qc26TBbIBO2XxVMlG2Adqy8i2kPbd/mJ/ecLRG9zpi 12 | J5DBCDvWDjluW9dg/ujw4MOqnD6hRMSGa7vlY/owFDJusL/83I/dNEqUdJHE/UNC 13 | pItMjATAdMv7ElWzZ84Hy54DA+nhcT53+oGtdKZQWkARYA5634eHfKvrHcYVcqdr 14 | Q/QwE1v4dRAfLYi/Rop+ogr8IY/OPjkP+gNnNJk9PUfUQw8HPqnPlQPwRy20Cuv3 15 | nR7YNF0t/j/KIFR8/6VeOPUMAOu6UL2G4P7UxWpt1TmhAgMBAAEwDQYJKoZIhvcN 16 | AQELBQADggEBAMlct80kKtw81bqFhM8JjALqEaBYpkbyfb2bp07Dp4GmmUBtqtw5 17 | 38AbQuShRVGcEPVdoJuNFyZ4Dec6im/kmfeh420V5x28o3vozOce5MOzdGGIlT5L 18 | Agj3lXOogHjtfKJTjTo6gbjcZMoP9K9OmN/6tjMbYKmfJHKHtxpAsTfWPXTeW6vy 19 | PYf8Quu/pCtbqsh0blaTZHfml8whSEN3f87EhWXkzypX3vZotXQuRQ7y/TP/x8/I 20 | slJ3WEdzTVZ6KWpswa8mUIZdzJByOlosw7zk5F213YKojt5PVl5huWELBMVjZwMo 21 | VenTGhv8OIP6gkfngLh6iGT/fw63Ev2P410= 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /C_webserver/SSL/server_domain/server-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEowIBAAKCAQEAvyYCAvhrX0f7w3oGbJCRhFYtbgjys3J+tliYe/yMZ8L5M5m6 3 | dtQZQng3q0FULrOUHNukwWyATtl8VTJRtgHasvItpD23f5if3nC0Rvc6YieQwQg7 4 | 1g45blvXYP7o8ODDqpw+oUTEhmu75WP6MBQybrC//NyP3TRKlHSRxP1DQqSLTIwE 5 | wHTL+xJVs2fOB8ueAwPp4XE+d/qBrXSmUFpAEWAOet+Hh3yr6x3GFXKna0P0MBNb 6 | +HUQHy2Iv0aKfqIK/CGPzj45D/oDZzSZPT1H1EMPBz6pz5UD8EcttArr950e2DRd 7 | Lf4/yiBUfP+lXjj1DADrulC9huD+1MVqbdU5oQIDAQABAoIBADEoPyAwbryEMJTm 8 | zrwguauE1g4UMwY/DaMrSZupKRqOI7RHdpKUnSJg9EAQfuu7tv1s5wPvOVgNylHG 9 | rQjXlTyr110DmiswPvzfkx0k+1i+wBVEXs7/vXlKGSuSoqk/xFId+GVU4A2Jqzqk 10 | 6XRv3UBmKBmJR14l0oA3Mj2svB1o7LF0BnVS2oJ5nAzvRCWWGfLQJZi2gdv4EUQx 11 | A+kvF3Kpt8jBp4nhI1TpwBkOhdG5KBmjwE6JsImT3h2rtYGIAsA8a4zfm2o5/kfJ 12 | pb0uuH5FxfsWOI9/5mLsrmETZTa7fhCWDVlWCqntoZIlkpJMxGJANiXcc4vJm24R 13 | MraqOrkCgYEA/Sa4w9OsKESU81fGTke2lF4eXIKpAWyXnecpBuZKJXMw5XpozQLx 14 | ZBdM+4h3VqDtA7CfJfrFdtKXb/pB1bs/DIgHTNsDT15A7McbPR5cuUDmbVBx0pGz 15 | ArkhBN3/urNHnfjL1hcPJ2XJTxeugp84pTQeP1ZFQ7aRBV6apqFGtgMCgYEAwUyr 16 | H/le9H/l0VKO3E0BJZQYjTSN7u8a37Mu2kjvYG544dFTJpyX9d2FMaxxx1LgWCMq 17 | izLJpbRp/eRADEPVo2fASJS0c/raZ+v0lCBEgdzAmoga8wrXAmsE92Iu8Y+pfOwa 18 | 0gMqsq9e1gI0asaLjod24l9TuZrjr9Q1oOVsIosCgYB5W+jTqFQt8cLebcPZnzN+ 19 | KSiw/Mp8rkx5HGpkrl35WiGkwWwgbDrA2xLCuwdK9lbpn/CLyo6Dii2jNvv8tIlj 20 | PosRYyVRFURWvpTmVfnprZ1J5njKk6KXuZyEstB39p5ssus1NVTEdF1vl1DHugDz 21 | 4epmPrtx3MHlKxdErqgxdQKBgGAmWcyqxy/JWrCXZ1Zvu01M8DV02dDrAKwbPgf4 22 | VZHbAagZ7kl7hR8YVEOUKnhiYhOVUnkxBxq0tjBDVBSFvYPtfLjdtzElq3Qb62mu 23 | 70TFYMy9POJ+FtsuDqdbIEyqED2CWAj06E0/bGX5bMdcAVkhSuJpVoUxZWY1oYNp 24 | +zLnAoGBAOQ3Qu4Bm76drrzGQ4rszTGRk3APhcbSnS+cIcB48cpn5/Sv8I/ofTxa 25 | P/VF9GZDy6FYzAS8GF/m5O8isVdj1nl3wcowh3mAxO+aAooLvF2F2abtJNMK9bTL 26 | a7YHmJAkzovlupKi3ZAVbjW0qPMKo0kRKzuyAvQ3EYB8L9je5F+J 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /C_webserver/SSL/server_domain/server-req.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC8DCCAdgCAQAwgZMxCzAJBgNVBAYTAkNOMQ4wDAYDVQQIDAVIdUJlaTEOMAwG 3 | A1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE 4 | CwwEdGVzdDEcMBoGA1UEAwwTd3d3LmFmbHlpbmdmaXNoLmNvbTEaMBgGCSqGSIb3 5 | DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 6 | AQC/JgIC+GtfR/vDegZskJGEVi1uCPKzcn62WJh7/Ixnwvkzmbp21BlCeDerQVQu 7 | s5Qc26TBbIBO2XxVMlG2Adqy8i2kPbd/mJ/ecLRG9zpiJ5DBCDvWDjluW9dg/ujw 8 | 4MOqnD6hRMSGa7vlY/owFDJusL/83I/dNEqUdJHE/UNCpItMjATAdMv7ElWzZ84H 9 | y54DA+nhcT53+oGtdKZQWkARYA5634eHfKvrHcYVcqdrQ/QwE1v4dRAfLYi/Rop+ 10 | ogr8IY/OPjkP+gNnNJk9PUfUQw8HPqnPlQPwRy20Cuv3nR7YNF0t/j/KIFR8/6Ve 11 | OPUMAOu6UL2G4P7UxWpt1TmhAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2 12 | MA0GCSqGSIb3DQEBCwUAA4IBAQB3n/LAP3kfvoLs7rkUPjpMl6Pazf++EoV4fJrT 13 | 9VyO1Gh1pwKDtVewS0CaEcvwkpgdY80zB8tQhshiXEMjBwb7qhJGuFLnSLwYT7Qr 14 | gdN/x5dS0CjwW2Afyo/wnNdKf6Xa9dMq1X2pX2Hr7sJxQej/Jv8cXbFWUPuN74GF 15 | pTxKqqDnza3+PWEKv1kDL0Xc7DAZ1xYIZ8Dk+M633HgYdYMt4Lm/RBif2/++x/Wu 16 | P5pWgdCe8cUT8DJFzBC4OacDtcC7FEne/QyoPM3qLF9Fv53Q39vmXsxESC20nmMo 17 | gdy8q0YlRhjI2xLGZvSuqXfdQZE0pR6oAraH9j0ElqdVQy6w 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /C_webserver/SSL/server_domain/server.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/SSL/server_domain/server.p12 -------------------------------------------------------------------------------- /C_webserver/files/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/files/favicon.ico -------------------------------------------------------------------------------- /C_webserver/files/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |
6 | 7 |
8 | 9 | 10 | -------------------------------------------------------------------------------- /C_webserver/files/snow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/files/snow.jpg -------------------------------------------------------------------------------- /C_webserver/files/upload.txt: -------------------------------------------------------------------------------- 1 | Send done. 2 | -------------------------------------------------------------------------------- /C_webserver/files/uploaderr.txt: -------------------------------------------------------------------------------- 1 | Send error. 2 | -------------------------------------------------------------------------------- /C_webserver/files/weed.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/files/weed.jpg -------------------------------------------------------------------------------- /C_webserver/http/Http.c: -------------------------------------------------------------------------------- 1 | #include "Http.h" 2 | 3 | #define BUFFER_SIZE 8192 4 | 5 | int DealWithRequest(Socket sock){ 6 | //libevent并发 7 | struct event_base* base = event_base_new(); //event_init(); 8 | Eventarg* eventarg = (Eventarg*)malloc(sizeof(Eventarg)); 9 | eventarg->base = base; 10 | eventarg->firsttime = true; 11 | eventarg->sock = &sock; 12 | struct event* ev_listen = event_new(base,sock.sockId,EV_READ | EV_PERSIST,accept_cb,eventarg); 13 | eventarg->event = ev_listen; 14 | struct timeval tv; 15 | tv.tv_sec = alivetime; 16 | event_add(ev_listen,&tv); 17 | event_base_dispatch(base); 18 | return 0; 19 | } 20 | 21 | void accept_cb(int fd, short events, void* arg){ 22 | Eventarg* eventarg = (Eventarg*)arg; 23 | if(events==EV_TIMEOUT){ 24 | if(eventarg->firsttime==true) return; 25 | else{CloseHttp(eventarg);} 26 | }else{ 27 | eventarg->firsttime=false; 28 | struct Request* req = NULL; 29 | char buffer[BUFFER_SIZE]; 30 | 31 | int flag = ReadHttpHeaderBytes(*(eventarg->sock), buffer, BUFFER_SIZE); 32 | if (flag == -1){ 33 | //出现错误 34 | return; 35 | } 36 | else if (flag == -2){ 37 | // 客户端主动断开 38 | CloseHttp(eventarg); 39 | return; 40 | } 41 | 42 | req = phaser(strlen(buffer),buffer); 43 | if(memcmp(req->contentLength,"\0",1)!=0){ 44 | size_t len = atol(req->contentLength); 45 | req->bodyptr = (char*)malloc(len+1); 46 | memset(req->bodyptr,0,len+1); 47 | RecvDataByLength(*(eventarg->sock),req->bodyptr,len,0); 48 | } 49 | if(memcmp(req->Encoding,"chunked",7)==0) req->bodyptr = (char*)(eventarg->sock); 50 | printRequest(req); 51 | 52 | struct Block* block = init(req); 53 | 54 | printResponse(block); 55 | sendResponse(block,*(eventarg->sock)); 56 | if(block->connection==false){ 57 | CloseHttp(eventarg); 58 | } 59 | freeRequest(req); 60 | freeBlock(block); 61 | } 62 | } 63 | 64 | void freeRequest(struct Request* req){ 65 | if(req==NULL) return; 66 | if(req->bodyptr!=NULL) free(req->bodyptr); 67 | free(req); 68 | } 69 | 70 | void freeResponse(struct FinalResponse* res){ 71 | if(res==NULL) return; 72 | if(res->data!=NULL) free(res->data); 73 | free(res); 74 | } 75 | 76 | void freeFileinfo(struct FileInfo* fi){ 77 | if(fi==NULL) return; 78 | if(fi->fpath!=NULL) free(fi->fpath); 79 | free(fi); 80 | } 81 | 82 | void freeBlock(struct Block* block){ 83 | if(block==NULL) return; 84 | if(block->response!=NULL) freeResponse(block->response); 85 | if(block->fileinfo!=NULL) freeFileinfo(block->fileinfo); 86 | free(block); 87 | } 88 | 89 | void printRequest(struct Request* req){ 90 | printf("\n----------------------------------------------\n[New Request]\n"); 91 | printf(" method: %s\n",req->method); 92 | printf(" URL: %s\n",req->URL); 93 | printf(" URLlen: %ld\n",req->URLlen); 94 | printf(" version: %s\n",req->version); 95 | printf(" Connection: %s\n",req->connection); 96 | printf(" Accept: %s\n",req->accept); 97 | printf(" contentType: %s\n",req->contentType); 98 | printf(" contentLength: %s\n",req->contentLength); 99 | printf(" Encoding: %s\n",req->Encoding); 100 | //if(req->bodyptr!=NULL) printf("data:\n%s\n",req->bodyptr); 101 | } 102 | 103 | void printResponse(struct Block* block){ 104 | printf("\n----------------------------------------------\n[Response]\n"); 105 | printf("%s\n",block->response->data); 106 | if(block->fileinfo!=NULL) 107 | printf("path: %s\ntype: %s\n",block->fileinfo->fpath,block->fileinfo->type); 108 | printf("----------------------------------------------\n"); 109 | } 110 | 111 | int ReadHttpHeaderBytes(Socket sock, char *data, int maxBuffer) 112 | { 113 | int flag = RecvDataByFlag(sock, data, maxBuffer, "\r\n\r\n",0); 114 | 115 | if (flag == -1) 116 | { 117 | #ifdef OUTPUT_ERROR_INFOR 118 | printf("读取http header时发生错误\n"); 119 | #endif 120 | *data = '\0'; 121 | return -1; 122 | } 123 | else if (flag == -2) 124 | { 125 | return -2; 126 | } 127 | return 0; 128 | } 129 | 130 | void sendResponse(struct Block* block, Socket sock){ 131 | if(block==NULL) return; 132 | SendData(sock,block->response->data,block->response->len,false,false); 133 | if(block->fileinfo!=NULL){ 134 | SendFile(sock,block->fileinfo->fpath,block->chunked,true); 135 | } 136 | } 137 | 138 | int ResponseHttpWithHtml(Socket sock, HttpKind httpKind, char *htmlPath) 139 | { 140 | // 计算http 头部内容 141 | char headerBuffer[BUFFER_SIZE]; 142 | memset(headerBuffer, 0, BUFFER_SIZE); 143 | 144 | // 计算获取正确的html path 145 | char path[500]; 146 | memset(path, 0, 500); 147 | strcpy(path, "response/"); 148 | 149 | // 插入http类型,并计算正确的http文件所在path 150 | switch (httpKind) 151 | { 152 | case Error_400: 153 | strcat(headerBuffer, "HTTP/1.1 400 BAD REQUEST\r\n"); 154 | 155 | strcat(path, "400.html"); 156 | break; 157 | case Error_404: 158 | strcat(headerBuffer, "HTTP/1.1 404 NOT FOUND\r\n"); 159 | 160 | strcat(path, "404.html"); 161 | break; 162 | case Error_500: 163 | strcat(headerBuffer, "HTTP/1.1 500 Internal Server Error\r\n"); 164 | 165 | strcat(path, "500.html"); 166 | break; 167 | case Error_501: 168 | strcat(headerBuffer, "HTTP/1.1 501 Method Not Implemented\r\n"); 169 | 170 | strcat(path, "501.html"); 171 | break; 172 | case Success_200: 173 | strcat(path, htmlPath); 174 | if (htmlPath == NULL || access(path, F_OK) != 0) 175 | { 176 | #ifdef OUTPUT_ERROR_INFOR 177 | printf("获取返回html时为空,将自动渲染404界面\n"); 178 | #endif 179 | strcat(headerBuffer, "HTTP/1.1 400 BAD REQUEST\r\n"); 180 | memset(path, 0, 500); 181 | strcpy(path, "response/404.html"); 182 | httpKind = Error_404; 183 | break; 184 | } 185 | 186 | // 以下仅为测试代码 187 | strcat(headerBuffer, "HTTP/1.1 200 OK\r\n"); 188 | break; 189 | 190 | default: 191 | #ifdef OUTPUT_ERROR_INFOR 192 | printf("HTTP_HTML Response错误枚举\n"); 193 | #endif 194 | return -1; 195 | } 196 | 197 | strcat(headerBuffer, "Server: C http server 1.0\r\n"); 198 | strcat(headerBuffer, "Connection: keep-alive\r\n"); 199 | strcat(headerBuffer, "Content-Type: text/html\r\n"); 200 | 201 | // 写入data长度 202 | int dataLength = GetFileLength(path); 203 | 204 | char dataLengthString[30]; 205 | memset(dataLengthString, 0, 30); 206 | sprintf(dataLengthString, "Content-Length: %d\r\n", dataLength); 207 | strcat(headerBuffer, dataLengthString); 208 | //strcat(headerBuffer, "Transfer-Encoding: chunked\r\n"); 209 | 210 | // 写入空行 211 | strcat(headerBuffer, "\r\n"); 212 | 213 | #ifdef OUTPUT_DEBUG_INFO 214 | printf("发送头部:\n%s", headerBuffer); 215 | #endif 216 | 217 | SendData(sock, headerBuffer,strlen(headerBuffer),false,false); // 发送头部 218 | SendFile(sock, path,false,true); 219 | // char *d = "test\r\n

this is test

"; 220 | // SendData(sock, d, strlen(d),true,true); 221 | } 222 | 223 | int ResponseHttp(Socket sock, char *contentType, char *filePath, Bool allowChunked) 224 | { 225 | // 计算获取正确的文件path 226 | char path[500]; 227 | memset(path, 0, 500); 228 | strcpy(path, "response/"); 229 | strcat(path, filePath); 230 | 231 | // 判断文件是否存在 232 | if (access(path, F_OK) != 0) 233 | { 234 | // 资源文件不存在 235 | ResponseHttpWithHtml(sock, Error_404, NULL); 236 | return -1; 237 | } 238 | 239 | // 计算http 头部内容 240 | char headerBuffer[BUFFER_SIZE]; 241 | memset(headerBuffer, 0, BUFFER_SIZE); 242 | 243 | strcat(headerBuffer, "HTTP/1.1 200 OK\r\n"); 244 | strcat(headerBuffer, "Server: C http server 1.0\r\n"); 245 | strcat(headerBuffer, "Connection: keep-alive\r\n"); 246 | 247 | // 输入ContentType 248 | strcat(headerBuffer, "Content-Type: "); 249 | strcat(headerBuffer, contentType); 250 | strcat(headerBuffer, "\r\n"); 251 | 252 | strcat(headerBuffer, "Content-Disposition:attachment;filename="); 253 | char fileName[40]; 254 | memset(fileName, 0, 40); 255 | GetFileName(filePath, fileName); 256 | strcat(headerBuffer, fileName); 257 | strcat(headerBuffer, "\r\n"); 258 | 259 | if(!allowChunked) 260 | { 261 | // 使用Content-Length的方式写入 262 | int dataLength = GetFileLength(path); 263 | 264 | char dataLengthString[30]; 265 | memset(dataLengthString, 0, 30); 266 | sprintf(dataLengthString, "Content-Length: %d\r\n", dataLength); 267 | strcat(headerBuffer, dataLengthString); 268 | } 269 | else 270 | { 271 | // 使用chunked的方式写入 272 | strcat(headerBuffer, "Transfer-Encoding: chunked\r\n"); 273 | } 274 | strcat(headerBuffer, "\r\n"); // 增加空行, 头部生成完毕 275 | 276 | #ifdef OUTPUT_DEBUG_INFO 277 | printf("发送头部:\n%s", headerBuffer); 278 | #endif 279 | 280 | SendData(sock, headerBuffer,strlen(headerBuffer),false,false); // 发送头部 281 | SendFile(sock, path, allowChunked,true); 282 | return 0; 283 | } 284 | 285 | void CloseHttp(Eventarg* eventarg){ 286 | event_base_loopbreak(eventarg->base); 287 | event_del(eventarg->event); 288 | event_free(eventarg->event); 289 | event_base_free(eventarg->base); 290 | CloseSocket(*(eventarg->sock)); 291 | free(eventarg); 292 | printf("[Info] HTTP/HTTPS connection close.\n"); 293 | return; 294 | } -------------------------------------------------------------------------------- /C_webserver/http/SSL.c: -------------------------------------------------------------------------------- 1 | #include "SSL.h" 2 | 3 | SSL_CTX* InitSSL() 4 | { 5 | SSL_library_init(); // 初始化SSL库 6 | OpenSSL_add_all_algorithms(); //载入所有SSL算法 7 | SSL_load_error_strings(); //载入所有错误信息 8 | 9 | SSL_CTX *ctx = SSL_CTX_new(TLS_server_method()); 10 | if(ctx==NULL) 11 | { 12 | #ifdef OUTPUT_ERROR_INFOR 13 | printf("初始化CTX失败\n"); 14 | #endif 15 | return NULL; 16 | } 17 | 18 | // 要求校验对方证书 19 | SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); 20 | // 加载CA的证书 21 | SSL_CTX_load_verify_locations(ctx, CAFILE, NULL); //设置CA 22 | 23 | // 加载自己的证书 24 | if (SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM)<=0) 25 | { 26 | ERR_print_errors_fp(stderr); 27 | #ifdef OUTPUT_ERROR_INFOR 28 | printf("加载认证证书出错\n"); 29 | #endif 30 | return NULL; 31 | } 32 | 33 | // 加载自己的私钥 34 | if (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) <= 0) 35 | { 36 | ERR_print_errors_fp(stderr); 37 | #ifdef OUTPUT_ERROR_INFOR 38 | printf("加载私钥出错\n"); 39 | #endif 40 | return NULL; 41 | } 42 | 43 | // 验证私钥是否正确 44 | if (!SSL_CTX_check_private_key(ctx)) 45 | { 46 | #ifdef OUTPUT_ERROR_INFOR 47 | printf("公钥与私钥不匹配\n"); 48 | #endif 49 | return NULL; 50 | } 51 | 52 | // SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(CAFILE)); 53 | // // SSL_CTX_set_cipher_list(ctx, "RC4-MD5"); 54 | 55 | SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY); 56 | return ctx; 57 | } 58 | 59 | SSL* AttachSSLWithSocket(int sockId, SSL_CTX* ctx) 60 | { 61 | if(ctx==NULL) 62 | { 63 | #ifdef OUTPUT_ERROR_INFOR 64 | printf("计算SSL时,ctx=NULL \n"); 65 | #endif 66 | return NULL; 67 | } 68 | 69 | SSL* ssl = SSL_new(ctx); 70 | if (ssl==NULL) 71 | { 72 | #ifdef OUTPUT_ERROR_INFOR 73 | printf("初始化SSL时发生错误\n"); 74 | #endif 75 | return NULL; 76 | } 77 | 78 | //绑定套接字与SSL 79 | if (SSL_set_fd(ssl, sockId)==0) 80 | { 81 | #ifdef OUTPUT_ERROR_INFOR 82 | printf("关联SSL与套接字出错\n"); 83 | #endif 84 | return NULL; 85 | } 86 | 87 | for (int i = 0; i < 100;i++) 88 | { 89 | int k = SSL_accept(ssl); 90 | if (k<=0) 91 | { 92 | continue; 93 | } 94 | else 95 | { 96 | if(!VerifyX509(ssl)) 97 | { 98 | SSL_free(ssl); 99 | return NULL; 100 | } 101 | 102 | return ssl; 103 | } 104 | } 105 | 106 | #ifdef OUTPUT_ERROR_INFOR 107 | printf("SSL连接出错, 信息: %s \n", ERR_reason_error_string(ERR_get_error())); 108 | #endif 109 | return NULL; 110 | } 111 | 112 | Bool VerifyX509(SSL* ssl) 113 | { 114 | 115 | X509 *client_cert = SSL_get_peer_certificate(ssl); 116 | 117 | #ifdef OUTPUT_DEBUG_INFO 118 | printf("\n用户证书如下:\n"); 119 | #endif 120 | 121 | if (client_cert != NULL) 122 | { 123 | char *str = X509_NAME_oneline(X509_get_subject_name(client_cert), 0, 0); 124 | if (!str) 125 | { 126 | #ifdef OUTPUT_ERROR_INFOR 127 | printf("subject\n"); 128 | #endif 129 | return false; 130 | } 131 | 132 | #ifdef OUTPUT_DEBUG_INFO 133 | printf("subject: %s\n", str); 134 | #endif 135 | OPENSSL_free(str); 136 | 137 | str = X509_NAME_oneline(X509_get_issuer_name(client_cert), 0, 0); 138 | if (!str) 139 | { 140 | #ifdef OUTPUT_ERROR_INFOR 141 | printf("issuer存在错误\n"); 142 | #endif 143 | return false; 144 | } 145 | 146 | #ifdef OUTPUT_DEBUG_INFO 147 | printf("issuer: %s\n\n", str); 148 | #endif 149 | X509_free(client_cert); 150 | OPENSSL_free(str); 151 | return true; 152 | } 153 | else 154 | { 155 | #ifdef OUTPUT_ERROR_INFOR 156 | printf("用户证书不存在\n"); 157 | #endif 158 | return false; 159 | } 160 | } 161 | 162 | void FreeSSL(SSL* ssl, SSL_CTX* ctx) 163 | { 164 | if(!ssl) 165 | { 166 | SSL_shutdown(ssl); 167 | SSL_free(ssl); 168 | ssl = NULL; 169 | } 170 | 171 | if(!ctx) 172 | { 173 | SSL_CTX_free(ctx); 174 | ctx = NULL; 175 | } 176 | } 177 | 178 | // SSL_write(ssl, "Server is connect to you!\n", strlen("Server is connect to you!\n")); 179 | // SSL_read(ssl, buf, sizeof(buf)); -------------------------------------------------------------------------------- /C_webserver/http/SSL/all/ca-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDnTCCAoUCFE6LmALvewpst3nJfL070p2PFkR3MA0GCSqGSIb3DQEBCwUAMIGK 3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow 4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE 5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw 6 | MTAyOTA2MzU0OVoXDTMwMTAyNzA2MzU0OVowgYoxCzAJBgNVBAYTAmNuMQ4wDAYD 7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNo 8 | VmlzaW9uMQ0wCwYDVQQLDAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgG 9 | CSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw 10 | ggEKAoIBAQDYa6Ka07ExL3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMy 11 | Cw0SwNR2Ufze+Riys1+ek179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72f 12 | YsAKOdx4SzIGWfdokWpyG61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oE 13 | eibobvXCeoMpfsN7kT9ryN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBy 14 | tuSiIkC6vIONaQzTZ2JnVwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGCl 15 | nU5vTxtxCJmSG6VNndClZomMAn1jJDajAgMBAAEwDQYJKoZIhvcNAQELBQADggEB 16 | AHmTRk1QSZpUhsTLNluH6JiXDq0MyroypPfLhw9DZdh03LA+phGw2Bs9AeWf5qwV 17 | 4Z2txU5FKNyQUODKqC3qtFC8riLqncwhZ87QEEWUuTRWBbpTmsNjZl40Tr0vir9v 18 | WAy7gmke18YfRjdRpep7DDmHb3+PxkllSzKD4N78Ruhm4vIHTagoOiYmkgRMt94W 19 | T7YNI4LE8OGq+5WtXb6V8H5gzoWexBsh87fIJuYpB5xEMnV0BSYVs5Nnlj62qAqq 20 | ijwKav+Nok5PfL5Ozn+aple4UL8tk0qjF6BdFyQPRZ5Iqx5KntMeQ0EhrMMmhhzk 21 | Dv1+KXmmHdU5OaQUpyuDsN0= 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/all/ca-cert.srl: -------------------------------------------------------------------------------- 1 | 2F82CB83C2A0B4CEC3EB0E0C82923FE9F34E9AA4 2 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/all/ca-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEowIBAAKCAQEA2GuimtOxMS96IDouMJE7HSimANgf6up0dNdB26cgydzBXrN/ 3 | eH2DMgsNEsDUdlH83vkYsrNfnpNe/UyNiPYHwA4NfsdZWgkjbJQLElaQ0FQCY7KQ 4 | qSe9n2LACjnceEsyBln3aJFqchutcJd+9v4sD86HaKOY05B9yqvbTnblOIeaJRgc 5 | NGOaBHom6G71wnqDKX7De5E/a8jfWTRTK26O9qMopeAdSd53AFjS6tuht87Ad3xS 6 | 3/zAcrbkoiJAuryDjWkM02diZ1cCBFsL9dJz6uOIqKN7vGab/03DTbdzY3ge2INW 7 | TlBgpZ1Ob08bcQiZkhulTZ3QpWaJjAJ9YyQ2owIDAQABAoIBAQCD5HTgboraMtj2 8 | sv5bUub3ykIA2bX58JCwdE8KkjwFSaf/Et1ojPVbliiNeT8CLM0zBhPrNC3d8mo9 9 | bF4FTgtDHE1VKiBmIpOYJFDrCB6RF+Gs6LIIpNOHQyNOGB0ooosGG+YPsC9zAzMc 10 | HvedhyFLMM6NEsaciL5guYOZuhPP8pUzgHlX+QbYi5BSebbxIUtVkExgyLfwTpIO 11 | f79X5pQJa6PKMoApBU+eH+lhH2e4UHYJhxNeqXnxvYBWM01LsPHT+AvEsFqZAotH 12 | R9sPwGvfw+euf51AV5Xe5IIO0judyFe2NRgHNSCJtqFTQrP5c0r+kzg8c44qZe/W 13 | mRDxrFuhAoGBAOypoKYNPuGnfqHsAWg7GDrBDJNxFg57uavljqRAe8l9mf1t8SUs 14 | HKGtCyNKyMqeB+fhREtTTnZvD48B/vdLPr17Ju+kmgf3pMdNG68/xl9WsnjBz0aT 15 | z7saf4olr4aRTZPyBG5w/o1BJhwUwa526sFhalpBQHD/98VKvvfUuZJPAoGBAOoa 16 | mARXRvsQfM8ET8B62F7f5eGu0RNLCMAmFE0pG/kIIEl1yM3Xa+OcEYQIhQdNg5TP 17 | xSNHeimJDdlvTIRIQAbNdVDQX/vzKbPlqJ5frK6dEGBqqpkY+F4Leo8TPH5ygmVf 18 | /cAffC6fGykpvJRocY0b3CSEC+C5LHOEGPBs7KVtAoGAE/6s3PqngmclUsbew5Ci 19 | lmwzBM38IBMh97z4VTZBfx+GgBvm0M4uSRaWp0+tMTkyz8t/eqG6MlVlyh5QDVKl 20 | JVsfSgXtIZkxqckA+sh3mRx5DazKN1tLpLIzbleKweLK3CIJb89KImMLtjmmt3fC 21 | k74IP0HeEO3/YALVqZimaQ8CgYAgsuo84Pv3IYxtVgrVtdL3HYr8hPCLI1XrkOYR 22 | CQbxN+Nan2sW5VoahrgjmxUJuhgA9yxwCxHTL2OR1Wv4pibbTGNwkEp35LUUfaWZ 23 | yX9TPHkHHp8Jl2VJrYzG40b12oTAKDJHXZ543JxsmXnPuO7zaMrNBuypzPOahv78 24 | xhof2QKBgEB5yS0/qH5Y6k8vijLZkwNmp9xgn49H6S4LHy5CHenuAE8DLn1w9RO5 25 | e3GpB58EoqArGxTXrDD1xPnM6X9DDv81KWZkjGJNF75gUs+4w7BfVpdiZ1dNMntY 26 | xC8xpo/1Z2acQ6sSjIGPaTSZP9wCQmCFY+iUaEseZyTjDaWyAzQK 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/all/ca-req.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC5zCCAc8CAQAwgYoxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG 3 | A1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNoVmlzaW9uMQ0wCwYDVQQL 4 | DAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgGCSqGSIb3DQEJARYLYWZs 5 | eWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYa6Ka07Ex 6 | L3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMyCw0SwNR2Ufze+Riys1+e 7 | k179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72fYsAKOdx4SzIGWfdokWpy 8 | G61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oEeibobvXCeoMpfsN7kT9r 9 | yN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBytuSiIkC6vIONaQzTZ2Jn 10 | VwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGClnU5vTxtxCJmSG6VNndCl 11 | ZomMAn1jJDajAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqGSIb3 12 | DQEBCwUAA4IBAQBcj1wA7gJX/Z8zboNl98h2UMksXgrglnfpoOqo6yJrVNA14GFz 13 | 8gaSRNRaf8M7LFM2SzrAeihC9qzuTHiFt964cqleKpn4s5oYiTuWUzL4bFtDUjD2 14 | qt9iGhObAwbt6i2okMOxPDwkhjBW2hu1sIzXR7Py9dUKPfGmhhyLUs54gTv8Nxo9 15 | hnuDrpMs2wnG9Ky38J8Jis+x7CixCHdGFqGDTN4j8Vjjk6lnwGfcau/kSJFUD9tN 16 | oUAIBw/4RkP+fv8NlKR1oia5L1qmWDSU4wFvv/tPMquVhR/XQsVQKOiaYbnoxbFG 17 | /S+xQCP7WtEoM8Bu54tTSJBFEDzA9omNgKPY 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/all/ca.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/http/SSL/all/ca.p12 -------------------------------------------------------------------------------- /C_webserver/http/SSL/all/client-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDnjCCAoYCFC+Cy4PCoLTOw+sODIKSP+nzTpqkMA0GCSqGSIb3DQEBCwUAMIGK 3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow 4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE 5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw 6 | MTAyOTA2MzgzN1oXDTMwMTAyNzA2MzgzN1owgYsxCzAJBgNVBAYTAmNuMQ4wDAYD 7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo 8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAY 9 | BgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A 10 | MIIBCgKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot38 11 | 3WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX 12 | 4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0i 13 | meECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7X 14 | PH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/m 15 | Wx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABMA0GCSqGSIb3DQEBCwUAA4IB 16 | AQBd9JzeFH9PLRPn5OyTSev4RG89xaq2qWPhOoREU3IDg3/ulGh6geptkfnXXCzA 17 | ZRU8KCKIp01fOhApYzCuxRWkyLTpz6pyO2XyK/dCYw/wVQK/bYnIipHIJVTpmmMy 18 | X6rF1QrhmDu4luWmKwJkkMVDBwTPtsjl0apTaR6jxHHUnP3I8TH/s2GONB+wBMKe 19 | m7L7FWfCdyrLWfKTyGnd8jcW4dqBMlKi9N/B8iFLv8ApKnKnk4lXzO4cC+RS/ohh 20 | z//My1uxt3IdwMQMftjeNryDKzN+1eNcplB6le21bksBd6a60J0Jm97rzTMnyRPe 21 | x5/u67ewVMFW42mvLtuSw/CX 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/all/client-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEogIBAAKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73 3 | Ot383WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG8 4 | 7kwX4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWM 5 | He0imeECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8 6 | cY7XPH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1 7 | Pu/mWx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABAoIBADzUgXmvV/wWrTQ0 8 | dY9UAIJEKbw7ooiIyjRHAsranjYmyZ2g98uatUXoCUoxTm7MYmXphCXYpqvGpnlX 9 | 4lA9kL9FPiS9ONsULVMrMIwWe16u4vMUlkPxJdhpOzqrBb4crJNXc0aftlKAfEgS 10 | 9fYCUDzFxEkrAlRXCEu8zBjJdXGqTGTJweERnrLMX18lv/IrZxL+6m8C24YMHuFh 11 | NpIVGhtYxTDhUZlVD9dxMvCpBPnENVr7Z8882MpbQORazMKCsL115eunqQcrBEib 12 | 4M1iea89zmsB7eYaah8F6mCz+CLr5IPD7XVK9PGfYEdHHVo6BdsbDL+kdPi3dwT5 13 | 48IIT00CgYEA5P7EZTLTgZuafpBXtRV+xS9kVvP26bI5DOyzsPRoiuIUYKvw/9/+ 14 | fnQxQuJuWsBY6CfHZe6S6mNe4nPqP+1F5aeK2vEF1kvnp4g9L1HQztE4NGIqlj7T 15 | m/sLgQQ9NP6Fb/sv9+JcZ+SN9aEe3o0CaADbIgrbeE5VWVmd7pd9YbcCgYEA3m0d 16 | uP4krvPWFL1wVXLNRZEeElGITskGewKR4eX8Pn90od+g+Vm27qvE8/6Ox0mBsMFt 17 | sfDQaJWqqTdoYiZusJP9L6vbzn50T9/71+D/BOvYaNVr35b4HUJ7WIDmnq+/W2ed 18 | Rx3j124ql8exbs680jznIxj7pIxQdNRLNtfQp6sCgYADxSoInICc9qnhgZDgG119 19 | 85zMTbH4AQYtb0w6EpwSBUzelpYeMFrpTBJvjnjQp7APCnCe/gGPOFmcktn9eXOY 20 | J10C48r7zz4eJQEU4Vz1ur4ZJrCazqf/Pm/fDOnREIuz30fX5fMthrbLn355nYq3 21 | maQB+HnKjkebc/1Eq1vWGwKBgCL7IDiO57AIMzwRyw/1PSlauFMDNZ/GZ9mCvvS7 22 | Gd+uZeZraEKvBGEm7JO/Di9zdQ0abqkUiYJZP3zbdPQyvSfSLniH28rvAlXpkQ8T 23 | mKfqe5+JKS0B7kWTxhhWNW7xjvPOKOMdZU7lSZeTVWlq5DFgWK2haToowyKMnMOk 24 | T3F/AoGAbxm3F6hL8pubyzzF4dMT9CHPEyoiFkRDSFijNKtylqfxGJYcHohMxKp0 25 | 4Hm5xXt2K80Sh3Jx2G1wg/n5kwz/DbYHm6PfgR688o35ZxPf6D2VuO/l7w7qdOTC 26 | gTKWj+uXWjKoWc1rod5ebDm62p9bVZ99weIWG9QHBlfLs+AunGU= 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/all/client-req.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC6DCCAdACAQAwgYsxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG 3 | A1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE 4 | CwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2Fm 5 | bHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxvaJX7fc 6 | RSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot383WfSv8FaSroDep0ZU890 7 | 2GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX4tusFWQOlF1NQkV1z9H3 8 | UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0imeECc7qQMpxElTkUk3ZI 9 | tMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7XPH8+n2yOzSj7k5tnC0oW 10 | IJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/mWx57Hz1X/iBn1DZNm1cZ 11 | 9MFfl7+8ES6mPQIDAQABoBcwFQYJKoZIhvcNAQkHMQgMBjEyMzQ1NjANBgkqhkiG 12 | 9w0BAQsFAAOCAQEAwkG2tUNkGWXxl4e6u59JfrNdhLTBWnO4wngF6xH64jGcHbEg 13 | Io42yQrBeZ8jmjpGrYbCdNlQqtx5veGgAfOD+wXm4KGJwbAacpBqajCY+orvxy3n 14 | s1h2v3NZ/D+74twsEE8TQeHAq4Z6wqbL4y7SkQnNyaePMHhM6tK1FGnohyUu/bCR 15 | brocrjuc+wsgcvV2m6rLxkO2nLnfAFvzR7iIXobr5dr0OqHYBjbvIBIFRt6YB4cj 16 | m4V7EtKBFxVmL1/Qnim3L7/MqHcG5IEJHu/2GehfXn/7IGE9PvuZlcDeFhGStAn4 17 | DJtLKY4QWrLDWgoZmj5nPNwNZy47gqAsCF2n/Q== 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/all/client.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/http/SSL/all/client.p12 -------------------------------------------------------------------------------- /C_webserver/http/SSL/all/server-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDoDCCAogCFC+Cy4PCoLTOw+sODIKSP+nzTpqjMA0GCSqGSIb3DQEBCwUAMIGK 3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow 4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE 5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw 6 | MTAyOTA2MzcwNFoXDTMwMTAyNzA2MzcwNFowgY0xCzAJBgNVBAYTAmNuMQ4wDAYD 7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo 8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEa 9 | MBgGCSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IB 10 | DwAwggEKAoIBAQDDgXIFJJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewog 11 | ujsEXbFPEzNJb/GAOxwDHppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7Dktn 12 | MJSdNnPqOaD+am+wn7Iw+qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4 13 | a/xn1SwyETPs31fx6mmV01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDL 14 | Ef3dn7ahwpJrvDPSBRCOrw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igw 15 | Oob4Yj/uwCRpOAyzWRLp2oaeg3HtfYDWs2/LAgMBAAEwDQYJKoZIhvcNAQELBQAD 16 | ggEBAKMFHOpoBpHbjpo39iDmaqgpUpkoLUG6MWyxEnugSnDpFnv7bCGX+mzxPYSc 17 | cPtScN3ZKWPNGvGs4W95TxPwHcpQSuQGEQQRATh3lwlvrJSqQrWYjehQT5sMlDrz 18 | ziDrOEN2CGzCE0Arv7DvG1aj9+bjENHpf16sYq2SBB3SIhfEQQ458CnHa5El0HVQ 19 | F8k2hQFym+z4ZZA3CjmiSf8fFgatXplvmQlZfaR98AL1ZBdw9FQMGaBzQ/BZG3Qc 20 | VP9FwfFbyN/w5oB5rGsTty+FQd6XfsAZLaE7yzQqkiXsW6134gap2EmzHXf2QcVV 21 | dUZBz1EtA3HkT5S5kPI5MzGL6Wc= 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/all/server-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEowIBAAKCAQEAw4FyBSSfIBwVStG8r5Tp/GAy2Ty0BTr4M5AsvubMBhN3BnsK 3 | ILo7BF2xTxMzSW/xgDscAx6aaCTsO2LFOKBL6VvNkn7QHiTEgRQGgFMYnb6mew5L 4 | ZzCUnTZz6jmg/mpvsJ+yMPqg6BcNKB1k54e/wDUBw/pqwUlw9f4ePp7C/Pt5OSWK 5 | OGv8Z9UsMhEz7N9X8eppldNSib3OWKCDLnbRgWZzfo6SkOKV+ImStZwTI2vnfDQg 6 | yxH93Z+2ocKSa7wz0gUQjq8OB77cdJ/SxcIVnjqBW8IaetzDyt04kN8DRjD/5too 7 | MDqG+GI/7sAkaTgMs1kS6dqGnoNx7X2A1rNvywIDAQABAoIBACcqYnYnTP14wsc3 8 | Vy5xjaJyfx1H7ORzWM+znVMtF0hMU/bnZTMDO9l3D5NAzHB0zZObw9PYKKSeaPjI 9 | o6vhaPO54WfsobK4OOmG4nqIqxDG5cEXLwHgGJWaGASfQOJW3kMq6t6nBt8X5xnX 10 | MaS0bDSMKeth2ksYdFnDa7mtwnA9cmvsVUFWH0Kb3GIHEvIkrBW0NySx09Torpua 11 | gPENHC/SLH9Wp2iq0buUbxqZ8zhQd23LUyuuAlzFE+x4gm1ElVWiVfdKoege3kyZ 12 | fWJy1j0ZSQOqbIoBg782R5W21o2i4ZJHm6zyHrxLPpTdgO7n0TA4j3TfIBekKexW 13 | /tBHD0kCgYEA+jTo6E1LxVsK5yt6FkFXFpcmKrH+uPU7c39JWET9AXsU4KVvEAoq 14 | aE7Z9UnBGHf1tU/SZrmqL9mD5KJMZdJiUSAuTmmdE7GITx9O2/wnf3VA+dmHgBQJ 15 | aHyRG/3vNDxOO2HPIjl5hHpawotyqdV/TXOnGkLV2rrkQbHyS1OZPXcCgYEAyAhM 16 | IW180qLjwTdFGrizjsbrsdtUXYxjPoL6YbFgcKNG8MiQzY0rSqZZM8um67qAXCE2 17 | to7ge2xhOPre9n6ARFctAmuQ+EZTcO8Rjd2V+LBYRZqJD/ieA0EnkyV7TE8tF9XD 18 | wYgfIwIdWbPytzrZ1bDzAZMPQo+iqu3IuY2EZU0CgYAZXJGbMnKSv6a8RfDrHpZo 19 | SMvqmf4620i6bVWO5/dJViOIndxDIPSpfAyly2MSSt6SEVQ/a2Rv0zmGTFk4HPow 20 | RPXMpvHwFBfABWll7QpH5ie+66jLd7x4ZeADmVrMzawUYtavHmpN3mUiwSXPRz/P 21 | JwDyLYIl2LnYWuQ3dHLdAwKBgBTU0GDWzx38eq1/fQHYZFKlIpyGE9YeLaOv7jVI 22 | TJvOVS/0IyhU4EJI6pc7SSnZZU6y4sjGPlh8I+/UKG4RJHh5f6V14EYKxNvI+dIF 23 | Vn3sl3TAMC/qm0IJgf6P87Qxtqd5yoYYD+4MZVQXKlqslUzsvZHXZ8ptvOoCE1pH 24 | g5ctAoGBAOTr9bzuXG73yvd8/x84ElqTgc7Fu+RtbEzcNoV+dzZiHXM6/ejb1NjY 25 | mw1ScFEYWSn8EMNd47QjIWHFwEMPQ+uE07ejcIcXEIJNlByBjjCz7A3zu/DoTpnK 26 | EtFdgrjQcMJ6XOYt+jOQAtWZLsxg9LAJ+UxEwNgYXItf9T7tnHs0 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/all/server-req.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC6jCCAdICAQAwgY0xCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG 3 | A1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE 4 | CwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEaMBgGCSqGSIb3DQEJARYL 5 | YWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDgXIF 6 | JJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewogujsEXbFPEzNJb/GAOxwD 7 | HppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7DktnMJSdNnPqOaD+am+wn7Iw 8 | +qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4a/xn1SwyETPs31fx6mmV 9 | 01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDLEf3dn7ahwpJrvDPSBRCO 10 | rw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igwOob4Yj/uwCRpOAyzWRLp 11 | 2oaeg3HtfYDWs2/LAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqG 12 | SIb3DQEBCwUAA4IBAQBpIJfk4hmga2x+rHmYB0xc6WIvUAblrpkwaaO2k9+ZbeLj 13 | d+8IDWfrA5H5RUQwaI4Q9fmOLTtR2aNMj6OoOCEj/F7DI4MXMr+Z+NA1zLeNla5l 14 | BwX/MYJYP/ElZLb9ygG/wZeoFLnqhz6LW7iJjdB2Vtg6o8goeIpzi1nfYZHc4OnI 15 | y9THVZA3xR7JTBXM7p/K3dBcfYz9H7Uu7CW3v0BnVK1v+Qxa35C+dR3Eug/sdh+j 16 | zPSzxuuPQAYfXSozQgGxN8pNAvOeVzqMVcJNKnkcAr0HOAtvHo1ulmGc2lf8W8b0 17 | ObP19R28lV0vbkK1jkmXvTw80L15kxfhAlyVjyUH 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/all/server.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/http/SSL/all/server.p12 -------------------------------------------------------------------------------- /C_webserver/http/SSL/ca/ca-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDnTCCAoUCFE6LmALvewpst3nJfL070p2PFkR3MA0GCSqGSIb3DQEBCwUAMIGK 3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow 4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE 5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw 6 | MTAyOTA2MzU0OVoXDTMwMTAyNzA2MzU0OVowgYoxCzAJBgNVBAYTAmNuMQ4wDAYD 7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNo 8 | VmlzaW9uMQ0wCwYDVQQLDAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgG 9 | CSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw 10 | ggEKAoIBAQDYa6Ka07ExL3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMy 11 | Cw0SwNR2Ufze+Riys1+ek179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72f 12 | YsAKOdx4SzIGWfdokWpyG61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oE 13 | eibobvXCeoMpfsN7kT9ryN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBy 14 | tuSiIkC6vIONaQzTZ2JnVwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGCl 15 | nU5vTxtxCJmSG6VNndClZomMAn1jJDajAgMBAAEwDQYJKoZIhvcNAQELBQADggEB 16 | AHmTRk1QSZpUhsTLNluH6JiXDq0MyroypPfLhw9DZdh03LA+phGw2Bs9AeWf5qwV 17 | 4Z2txU5FKNyQUODKqC3qtFC8riLqncwhZ87QEEWUuTRWBbpTmsNjZl40Tr0vir9v 18 | WAy7gmke18YfRjdRpep7DDmHb3+PxkllSzKD4N78Ruhm4vIHTagoOiYmkgRMt94W 19 | T7YNI4LE8OGq+5WtXb6V8H5gzoWexBsh87fIJuYpB5xEMnV0BSYVs5Nnlj62qAqq 20 | ijwKav+Nok5PfL5Ozn+aple4UL8tk0qjF6BdFyQPRZ5Iqx5KntMeQ0EhrMMmhhzk 21 | Dv1+KXmmHdU5OaQUpyuDsN0= 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/ca/ca-cert.srl: -------------------------------------------------------------------------------- 1 | 2F82CB83C2A0B4CEC3EB0E0C82923FE9F34E9AA5 2 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/ca/ca-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEowIBAAKCAQEA2GuimtOxMS96IDouMJE7HSimANgf6up0dNdB26cgydzBXrN/ 3 | eH2DMgsNEsDUdlH83vkYsrNfnpNe/UyNiPYHwA4NfsdZWgkjbJQLElaQ0FQCY7KQ 4 | qSe9n2LACjnceEsyBln3aJFqchutcJd+9v4sD86HaKOY05B9yqvbTnblOIeaJRgc 5 | NGOaBHom6G71wnqDKX7De5E/a8jfWTRTK26O9qMopeAdSd53AFjS6tuht87Ad3xS 6 | 3/zAcrbkoiJAuryDjWkM02diZ1cCBFsL9dJz6uOIqKN7vGab/03DTbdzY3ge2INW 7 | TlBgpZ1Ob08bcQiZkhulTZ3QpWaJjAJ9YyQ2owIDAQABAoIBAQCD5HTgboraMtj2 8 | sv5bUub3ykIA2bX58JCwdE8KkjwFSaf/Et1ojPVbliiNeT8CLM0zBhPrNC3d8mo9 9 | bF4FTgtDHE1VKiBmIpOYJFDrCB6RF+Gs6LIIpNOHQyNOGB0ooosGG+YPsC9zAzMc 10 | HvedhyFLMM6NEsaciL5guYOZuhPP8pUzgHlX+QbYi5BSebbxIUtVkExgyLfwTpIO 11 | f79X5pQJa6PKMoApBU+eH+lhH2e4UHYJhxNeqXnxvYBWM01LsPHT+AvEsFqZAotH 12 | R9sPwGvfw+euf51AV5Xe5IIO0judyFe2NRgHNSCJtqFTQrP5c0r+kzg8c44qZe/W 13 | mRDxrFuhAoGBAOypoKYNPuGnfqHsAWg7GDrBDJNxFg57uavljqRAe8l9mf1t8SUs 14 | HKGtCyNKyMqeB+fhREtTTnZvD48B/vdLPr17Ju+kmgf3pMdNG68/xl9WsnjBz0aT 15 | z7saf4olr4aRTZPyBG5w/o1BJhwUwa526sFhalpBQHD/98VKvvfUuZJPAoGBAOoa 16 | mARXRvsQfM8ET8B62F7f5eGu0RNLCMAmFE0pG/kIIEl1yM3Xa+OcEYQIhQdNg5TP 17 | xSNHeimJDdlvTIRIQAbNdVDQX/vzKbPlqJ5frK6dEGBqqpkY+F4Leo8TPH5ygmVf 18 | /cAffC6fGykpvJRocY0b3CSEC+C5LHOEGPBs7KVtAoGAE/6s3PqngmclUsbew5Ci 19 | lmwzBM38IBMh97z4VTZBfx+GgBvm0M4uSRaWp0+tMTkyz8t/eqG6MlVlyh5QDVKl 20 | JVsfSgXtIZkxqckA+sh3mRx5DazKN1tLpLIzbleKweLK3CIJb89KImMLtjmmt3fC 21 | k74IP0HeEO3/YALVqZimaQ8CgYAgsuo84Pv3IYxtVgrVtdL3HYr8hPCLI1XrkOYR 22 | CQbxN+Nan2sW5VoahrgjmxUJuhgA9yxwCxHTL2OR1Wv4pibbTGNwkEp35LUUfaWZ 23 | yX9TPHkHHp8Jl2VJrYzG40b12oTAKDJHXZ543JxsmXnPuO7zaMrNBuypzPOahv78 24 | xhof2QKBgEB5yS0/qH5Y6k8vijLZkwNmp9xgn49H6S4LHy5CHenuAE8DLn1w9RO5 25 | e3GpB58EoqArGxTXrDD1xPnM6X9DDv81KWZkjGJNF75gUs+4w7BfVpdiZ1dNMntY 26 | xC8xpo/1Z2acQ6sSjIGPaTSZP9wCQmCFY+iUaEseZyTjDaWyAzQK 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/ca/ca-req.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC5zCCAc8CAQAwgYoxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG 3 | A1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNoVmlzaW9uMQ0wCwYDVQQL 4 | DAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgGCSqGSIb3DQEJARYLYWZs 5 | eWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYa6Ka07Ex 6 | L3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMyCw0SwNR2Ufze+Riys1+e 7 | k179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72fYsAKOdx4SzIGWfdokWpy 8 | G61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oEeibobvXCeoMpfsN7kT9r 9 | yN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBytuSiIkC6vIONaQzTZ2Jn 10 | VwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGClnU5vTxtxCJmSG6VNndCl 11 | ZomMAn1jJDajAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqGSIb3 12 | DQEBCwUAA4IBAQBcj1wA7gJX/Z8zboNl98h2UMksXgrglnfpoOqo6yJrVNA14GFz 13 | 8gaSRNRaf8M7LFM2SzrAeihC9qzuTHiFt964cqleKpn4s5oYiTuWUzL4bFtDUjD2 14 | qt9iGhObAwbt6i2okMOxPDwkhjBW2hu1sIzXR7Py9dUKPfGmhhyLUs54gTv8Nxo9 15 | hnuDrpMs2wnG9Ky38J8Jis+x7CixCHdGFqGDTN4j8Vjjk6lnwGfcau/kSJFUD9tN 16 | oUAIBw/4RkP+fv8NlKR1oia5L1qmWDSU4wFvv/tPMquVhR/XQsVQKOiaYbnoxbFG 17 | /S+xQCP7WtEoM8Bu54tTSJBFEDzA9omNgKPY 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/ca/ca.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/http/SSL/ca/ca.p12 -------------------------------------------------------------------------------- /C_webserver/http/SSL/client_ip/client-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDnjCCAoYCFC+Cy4PCoLTOw+sODIKSP+nzTpqkMA0GCSqGSIb3DQEBCwUAMIGK 3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow 4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE 5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw 6 | MTAyOTA2MzgzN1oXDTMwMTAyNzA2MzgzN1owgYsxCzAJBgNVBAYTAmNuMQ4wDAYD 7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo 8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAY 9 | BgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A 10 | MIIBCgKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot38 11 | 3WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX 12 | 4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0i 13 | meECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7X 14 | PH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/m 15 | Wx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABMA0GCSqGSIb3DQEBCwUAA4IB 16 | AQBd9JzeFH9PLRPn5OyTSev4RG89xaq2qWPhOoREU3IDg3/ulGh6geptkfnXXCzA 17 | ZRU8KCKIp01fOhApYzCuxRWkyLTpz6pyO2XyK/dCYw/wVQK/bYnIipHIJVTpmmMy 18 | X6rF1QrhmDu4luWmKwJkkMVDBwTPtsjl0apTaR6jxHHUnP3I8TH/s2GONB+wBMKe 19 | m7L7FWfCdyrLWfKTyGnd8jcW4dqBMlKi9N/B8iFLv8ApKnKnk4lXzO4cC+RS/ohh 20 | z//My1uxt3IdwMQMftjeNryDKzN+1eNcplB6le21bksBd6a60J0Jm97rzTMnyRPe 21 | x5/u67ewVMFW42mvLtuSw/CX 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/client_ip/client-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEogIBAAKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73 3 | Ot383WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG8 4 | 7kwX4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWM 5 | He0imeECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8 6 | cY7XPH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1 7 | Pu/mWx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABAoIBADzUgXmvV/wWrTQ0 8 | dY9UAIJEKbw7ooiIyjRHAsranjYmyZ2g98uatUXoCUoxTm7MYmXphCXYpqvGpnlX 9 | 4lA9kL9FPiS9ONsULVMrMIwWe16u4vMUlkPxJdhpOzqrBb4crJNXc0aftlKAfEgS 10 | 9fYCUDzFxEkrAlRXCEu8zBjJdXGqTGTJweERnrLMX18lv/IrZxL+6m8C24YMHuFh 11 | NpIVGhtYxTDhUZlVD9dxMvCpBPnENVr7Z8882MpbQORazMKCsL115eunqQcrBEib 12 | 4M1iea89zmsB7eYaah8F6mCz+CLr5IPD7XVK9PGfYEdHHVo6BdsbDL+kdPi3dwT5 13 | 48IIT00CgYEA5P7EZTLTgZuafpBXtRV+xS9kVvP26bI5DOyzsPRoiuIUYKvw/9/+ 14 | fnQxQuJuWsBY6CfHZe6S6mNe4nPqP+1F5aeK2vEF1kvnp4g9L1HQztE4NGIqlj7T 15 | m/sLgQQ9NP6Fb/sv9+JcZ+SN9aEe3o0CaADbIgrbeE5VWVmd7pd9YbcCgYEA3m0d 16 | uP4krvPWFL1wVXLNRZEeElGITskGewKR4eX8Pn90od+g+Vm27qvE8/6Ox0mBsMFt 17 | sfDQaJWqqTdoYiZusJP9L6vbzn50T9/71+D/BOvYaNVr35b4HUJ7WIDmnq+/W2ed 18 | Rx3j124ql8exbs680jznIxj7pIxQdNRLNtfQp6sCgYADxSoInICc9qnhgZDgG119 19 | 85zMTbH4AQYtb0w6EpwSBUzelpYeMFrpTBJvjnjQp7APCnCe/gGPOFmcktn9eXOY 20 | J10C48r7zz4eJQEU4Vz1ur4ZJrCazqf/Pm/fDOnREIuz30fX5fMthrbLn355nYq3 21 | maQB+HnKjkebc/1Eq1vWGwKBgCL7IDiO57AIMzwRyw/1PSlauFMDNZ/GZ9mCvvS7 22 | Gd+uZeZraEKvBGEm7JO/Di9zdQ0abqkUiYJZP3zbdPQyvSfSLniH28rvAlXpkQ8T 23 | mKfqe5+JKS0B7kWTxhhWNW7xjvPOKOMdZU7lSZeTVWlq5DFgWK2haToowyKMnMOk 24 | T3F/AoGAbxm3F6hL8pubyzzF4dMT9CHPEyoiFkRDSFijNKtylqfxGJYcHohMxKp0 25 | 4Hm5xXt2K80Sh3Jx2G1wg/n5kwz/DbYHm6PfgR688o35ZxPf6D2VuO/l7w7qdOTC 26 | gTKWj+uXWjKoWc1rod5ebDm62p9bVZ99weIWG9QHBlfLs+AunGU= 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/client_ip/client-req.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC6DCCAdACAQAwgYsxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG 3 | A1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE 4 | CwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2Fm 5 | bHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxvaJX7fc 6 | RSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot383WfSv8FaSroDep0ZU890 7 | 2GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX4tusFWQOlF1NQkV1z9H3 8 | UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0imeECc7qQMpxElTkUk3ZI 9 | tMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7XPH8+n2yOzSj7k5tnC0oW 10 | IJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/mWx57Hz1X/iBn1DZNm1cZ 11 | 9MFfl7+8ES6mPQIDAQABoBcwFQYJKoZIhvcNAQkHMQgMBjEyMzQ1NjANBgkqhkiG 12 | 9w0BAQsFAAOCAQEAwkG2tUNkGWXxl4e6u59JfrNdhLTBWnO4wngF6xH64jGcHbEg 13 | Io42yQrBeZ8jmjpGrYbCdNlQqtx5veGgAfOD+wXm4KGJwbAacpBqajCY+orvxy3n 14 | s1h2v3NZ/D+74twsEE8TQeHAq4Z6wqbL4y7SkQnNyaePMHhM6tK1FGnohyUu/bCR 15 | brocrjuc+wsgcvV2m6rLxkO2nLnfAFvzR7iIXobr5dr0OqHYBjbvIBIFRt6YB4cj 16 | m4V7EtKBFxVmL1/Qnim3L7/MqHcG5IEJHu/2GehfXn/7IGE9PvuZlcDeFhGStAn4 17 | DJtLKY4QWrLDWgoZmj5nPNwNZy47gqAsCF2n/Q== 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/client_ip/client.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/http/SSL/client_ip/client.p12 -------------------------------------------------------------------------------- /C_webserver/http/SSL/server/server-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDoDCCAogCFC+Cy4PCoLTOw+sODIKSP+nzTpqjMA0GCSqGSIb3DQEBCwUAMIGK 3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow 4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE 5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw 6 | MTAyOTA2MzcwNFoXDTMwMTAyNzA2MzcwNFowgY0xCzAJBgNVBAYTAmNuMQ4wDAYD 7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo 8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEa 9 | MBgGCSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IB 10 | DwAwggEKAoIBAQDDgXIFJJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewog 11 | ujsEXbFPEzNJb/GAOxwDHppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7Dktn 12 | MJSdNnPqOaD+am+wn7Iw+qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4 13 | a/xn1SwyETPs31fx6mmV01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDL 14 | Ef3dn7ahwpJrvDPSBRCOrw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igw 15 | Oob4Yj/uwCRpOAyzWRLp2oaeg3HtfYDWs2/LAgMBAAEwDQYJKoZIhvcNAQELBQAD 16 | ggEBAKMFHOpoBpHbjpo39iDmaqgpUpkoLUG6MWyxEnugSnDpFnv7bCGX+mzxPYSc 17 | cPtScN3ZKWPNGvGs4W95TxPwHcpQSuQGEQQRATh3lwlvrJSqQrWYjehQT5sMlDrz 18 | ziDrOEN2CGzCE0Arv7DvG1aj9+bjENHpf16sYq2SBB3SIhfEQQ458CnHa5El0HVQ 19 | F8k2hQFym+z4ZZA3CjmiSf8fFgatXplvmQlZfaR98AL1ZBdw9FQMGaBzQ/BZG3Qc 20 | VP9FwfFbyN/w5oB5rGsTty+FQd6XfsAZLaE7yzQqkiXsW6134gap2EmzHXf2QcVV 21 | dUZBz1EtA3HkT5S5kPI5MzGL6Wc= 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/server/server-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEowIBAAKCAQEAw4FyBSSfIBwVStG8r5Tp/GAy2Ty0BTr4M5AsvubMBhN3BnsK 3 | ILo7BF2xTxMzSW/xgDscAx6aaCTsO2LFOKBL6VvNkn7QHiTEgRQGgFMYnb6mew5L 4 | ZzCUnTZz6jmg/mpvsJ+yMPqg6BcNKB1k54e/wDUBw/pqwUlw9f4ePp7C/Pt5OSWK 5 | OGv8Z9UsMhEz7N9X8eppldNSib3OWKCDLnbRgWZzfo6SkOKV+ImStZwTI2vnfDQg 6 | yxH93Z+2ocKSa7wz0gUQjq8OB77cdJ/SxcIVnjqBW8IaetzDyt04kN8DRjD/5too 7 | MDqG+GI/7sAkaTgMs1kS6dqGnoNx7X2A1rNvywIDAQABAoIBACcqYnYnTP14wsc3 8 | Vy5xjaJyfx1H7ORzWM+znVMtF0hMU/bnZTMDO9l3D5NAzHB0zZObw9PYKKSeaPjI 9 | o6vhaPO54WfsobK4OOmG4nqIqxDG5cEXLwHgGJWaGASfQOJW3kMq6t6nBt8X5xnX 10 | MaS0bDSMKeth2ksYdFnDa7mtwnA9cmvsVUFWH0Kb3GIHEvIkrBW0NySx09Torpua 11 | gPENHC/SLH9Wp2iq0buUbxqZ8zhQd23LUyuuAlzFE+x4gm1ElVWiVfdKoege3kyZ 12 | fWJy1j0ZSQOqbIoBg782R5W21o2i4ZJHm6zyHrxLPpTdgO7n0TA4j3TfIBekKexW 13 | /tBHD0kCgYEA+jTo6E1LxVsK5yt6FkFXFpcmKrH+uPU7c39JWET9AXsU4KVvEAoq 14 | aE7Z9UnBGHf1tU/SZrmqL9mD5KJMZdJiUSAuTmmdE7GITx9O2/wnf3VA+dmHgBQJ 15 | aHyRG/3vNDxOO2HPIjl5hHpawotyqdV/TXOnGkLV2rrkQbHyS1OZPXcCgYEAyAhM 16 | IW180qLjwTdFGrizjsbrsdtUXYxjPoL6YbFgcKNG8MiQzY0rSqZZM8um67qAXCE2 17 | to7ge2xhOPre9n6ARFctAmuQ+EZTcO8Rjd2V+LBYRZqJD/ieA0EnkyV7TE8tF9XD 18 | wYgfIwIdWbPytzrZ1bDzAZMPQo+iqu3IuY2EZU0CgYAZXJGbMnKSv6a8RfDrHpZo 19 | SMvqmf4620i6bVWO5/dJViOIndxDIPSpfAyly2MSSt6SEVQ/a2Rv0zmGTFk4HPow 20 | RPXMpvHwFBfABWll7QpH5ie+66jLd7x4ZeADmVrMzawUYtavHmpN3mUiwSXPRz/P 21 | JwDyLYIl2LnYWuQ3dHLdAwKBgBTU0GDWzx38eq1/fQHYZFKlIpyGE9YeLaOv7jVI 22 | TJvOVS/0IyhU4EJI6pc7SSnZZU6y4sjGPlh8I+/UKG4RJHh5f6V14EYKxNvI+dIF 23 | Vn3sl3TAMC/qm0IJgf6P87Qxtqd5yoYYD+4MZVQXKlqslUzsvZHXZ8ptvOoCE1pH 24 | g5ctAoGBAOTr9bzuXG73yvd8/x84ElqTgc7Fu+RtbEzcNoV+dzZiHXM6/ejb1NjY 25 | mw1ScFEYWSn8EMNd47QjIWHFwEMPQ+uE07ejcIcXEIJNlByBjjCz7A3zu/DoTpnK 26 | EtFdgrjQcMJ6XOYt+jOQAtWZLsxg9LAJ+UxEwNgYXItf9T7tnHs0 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/server/server-req.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC6jCCAdICAQAwgY0xCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG 3 | A1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE 4 | CwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEaMBgGCSqGSIb3DQEJARYL 5 | YWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDgXIF 6 | JJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewogujsEXbFPEzNJb/GAOxwD 7 | HppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7DktnMJSdNnPqOaD+am+wn7Iw 8 | +qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4a/xn1SwyETPs31fx6mmV 9 | 01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDLEf3dn7ahwpJrvDPSBRCO 10 | rw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igwOob4Yj/uwCRpOAyzWRLp 11 | 2oaeg3HtfYDWs2/LAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqG 12 | SIb3DQEBCwUAA4IBAQBpIJfk4hmga2x+rHmYB0xc6WIvUAblrpkwaaO2k9+ZbeLj 13 | d+8IDWfrA5H5RUQwaI4Q9fmOLTtR2aNMj6OoOCEj/F7DI4MXMr+Z+NA1zLeNla5l 14 | BwX/MYJYP/ElZLb9ygG/wZeoFLnqhz6LW7iJjdB2Vtg6o8goeIpzi1nfYZHc4OnI 15 | y9THVZA3xR7JTBXM7p/K3dBcfYz9H7Uu7CW3v0BnVK1v+Qxa35C+dR3Eug/sdh+j 16 | zPSzxuuPQAYfXSozQgGxN8pNAvOeVzqMVcJNKnkcAr0HOAtvHo1ulmGc2lf8W8b0 17 | ObP19R28lV0vbkK1jkmXvTw80L15kxfhAlyVjyUH 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/server/server.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/http/SSL/server/server.p12 -------------------------------------------------------------------------------- /C_webserver/http/SSL/server_domain/server-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDpjCCAo4CFC+Cy4PCoLTOw+sODIKSP+nzTpqlMA0GCSqGSIb3DQEBCwUAMIGK 3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow 4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE 5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw 6 | MTAyOTA4MzgzMFoXDTMwMTAyNzA4MzgzMFowgZMxCzAJBgNVBAYTAkNOMQ4wDAYD 7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo 8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEcMBoGA1UEAwwTd3d3LmFmbHlpbmdmaXNo 9 | LmNvbTEaMBgGCSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEB 10 | AQUAA4IBDwAwggEKAoIBAQC/JgIC+GtfR/vDegZskJGEVi1uCPKzcn62WJh7/Ixn 11 | wvkzmbp21BlCeDerQVQus5Qc26TBbIBO2XxVMlG2Adqy8i2kPbd/mJ/ecLRG9zpi 12 | J5DBCDvWDjluW9dg/ujw4MOqnD6hRMSGa7vlY/owFDJusL/83I/dNEqUdJHE/UNC 13 | pItMjATAdMv7ElWzZ84Hy54DA+nhcT53+oGtdKZQWkARYA5634eHfKvrHcYVcqdr 14 | Q/QwE1v4dRAfLYi/Rop+ogr8IY/OPjkP+gNnNJk9PUfUQw8HPqnPlQPwRy20Cuv3 15 | nR7YNF0t/j/KIFR8/6VeOPUMAOu6UL2G4P7UxWpt1TmhAgMBAAEwDQYJKoZIhvcN 16 | AQELBQADggEBAMlct80kKtw81bqFhM8JjALqEaBYpkbyfb2bp07Dp4GmmUBtqtw5 17 | 38AbQuShRVGcEPVdoJuNFyZ4Dec6im/kmfeh420V5x28o3vozOce5MOzdGGIlT5L 18 | Agj3lXOogHjtfKJTjTo6gbjcZMoP9K9OmN/6tjMbYKmfJHKHtxpAsTfWPXTeW6vy 19 | PYf8Quu/pCtbqsh0blaTZHfml8whSEN3f87EhWXkzypX3vZotXQuRQ7y/TP/x8/I 20 | slJ3WEdzTVZ6KWpswa8mUIZdzJByOlosw7zk5F213YKojt5PVl5huWELBMVjZwMo 21 | VenTGhv8OIP6gkfngLh6iGT/fw63Ev2P410= 22 | -----END CERTIFICATE----- 23 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/server_domain/server-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEowIBAAKCAQEAvyYCAvhrX0f7w3oGbJCRhFYtbgjys3J+tliYe/yMZ8L5M5m6 3 | dtQZQng3q0FULrOUHNukwWyATtl8VTJRtgHasvItpD23f5if3nC0Rvc6YieQwQg7 4 | 1g45blvXYP7o8ODDqpw+oUTEhmu75WP6MBQybrC//NyP3TRKlHSRxP1DQqSLTIwE 5 | wHTL+xJVs2fOB8ueAwPp4XE+d/qBrXSmUFpAEWAOet+Hh3yr6x3GFXKna0P0MBNb 6 | +HUQHy2Iv0aKfqIK/CGPzj45D/oDZzSZPT1H1EMPBz6pz5UD8EcttArr950e2DRd 7 | Lf4/yiBUfP+lXjj1DADrulC9huD+1MVqbdU5oQIDAQABAoIBADEoPyAwbryEMJTm 8 | zrwguauE1g4UMwY/DaMrSZupKRqOI7RHdpKUnSJg9EAQfuu7tv1s5wPvOVgNylHG 9 | rQjXlTyr110DmiswPvzfkx0k+1i+wBVEXs7/vXlKGSuSoqk/xFId+GVU4A2Jqzqk 10 | 6XRv3UBmKBmJR14l0oA3Mj2svB1o7LF0BnVS2oJ5nAzvRCWWGfLQJZi2gdv4EUQx 11 | A+kvF3Kpt8jBp4nhI1TpwBkOhdG5KBmjwE6JsImT3h2rtYGIAsA8a4zfm2o5/kfJ 12 | pb0uuH5FxfsWOI9/5mLsrmETZTa7fhCWDVlWCqntoZIlkpJMxGJANiXcc4vJm24R 13 | MraqOrkCgYEA/Sa4w9OsKESU81fGTke2lF4eXIKpAWyXnecpBuZKJXMw5XpozQLx 14 | ZBdM+4h3VqDtA7CfJfrFdtKXb/pB1bs/DIgHTNsDT15A7McbPR5cuUDmbVBx0pGz 15 | ArkhBN3/urNHnfjL1hcPJ2XJTxeugp84pTQeP1ZFQ7aRBV6apqFGtgMCgYEAwUyr 16 | H/le9H/l0VKO3E0BJZQYjTSN7u8a37Mu2kjvYG544dFTJpyX9d2FMaxxx1LgWCMq 17 | izLJpbRp/eRADEPVo2fASJS0c/raZ+v0lCBEgdzAmoga8wrXAmsE92Iu8Y+pfOwa 18 | 0gMqsq9e1gI0asaLjod24l9TuZrjr9Q1oOVsIosCgYB5W+jTqFQt8cLebcPZnzN+ 19 | KSiw/Mp8rkx5HGpkrl35WiGkwWwgbDrA2xLCuwdK9lbpn/CLyo6Dii2jNvv8tIlj 20 | PosRYyVRFURWvpTmVfnprZ1J5njKk6KXuZyEstB39p5ssus1NVTEdF1vl1DHugDz 21 | 4epmPrtx3MHlKxdErqgxdQKBgGAmWcyqxy/JWrCXZ1Zvu01M8DV02dDrAKwbPgf4 22 | VZHbAagZ7kl7hR8YVEOUKnhiYhOVUnkxBxq0tjBDVBSFvYPtfLjdtzElq3Qb62mu 23 | 70TFYMy9POJ+FtsuDqdbIEyqED2CWAj06E0/bGX5bMdcAVkhSuJpVoUxZWY1oYNp 24 | +zLnAoGBAOQ3Qu4Bm76drrzGQ4rszTGRk3APhcbSnS+cIcB48cpn5/Sv8I/ofTxa 25 | P/VF9GZDy6FYzAS8GF/m5O8isVdj1nl3wcowh3mAxO+aAooLvF2F2abtJNMK9bTL 26 | a7YHmJAkzovlupKi3ZAVbjW0qPMKo0kRKzuyAvQ3EYB8L9je5F+J 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/server_domain/server-req.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIC8DCCAdgCAQAwgZMxCzAJBgNVBAYTAkNOMQ4wDAYDVQQIDAVIdUJlaTEOMAwG 3 | A1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE 4 | CwwEdGVzdDEcMBoGA1UEAwwTd3d3LmFmbHlpbmdmaXNoLmNvbTEaMBgGCSqGSIb3 5 | DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 6 | AQC/JgIC+GtfR/vDegZskJGEVi1uCPKzcn62WJh7/Ixnwvkzmbp21BlCeDerQVQu 7 | s5Qc26TBbIBO2XxVMlG2Adqy8i2kPbd/mJ/ecLRG9zpiJ5DBCDvWDjluW9dg/ujw 8 | 4MOqnD6hRMSGa7vlY/owFDJusL/83I/dNEqUdJHE/UNCpItMjATAdMv7ElWzZ84H 9 | y54DA+nhcT53+oGtdKZQWkARYA5634eHfKvrHcYVcqdrQ/QwE1v4dRAfLYi/Rop+ 10 | ogr8IY/OPjkP+gNnNJk9PUfUQw8HPqnPlQPwRy20Cuv3nR7YNF0t/j/KIFR8/6Ve 11 | OPUMAOu6UL2G4P7UxWpt1TmhAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2 12 | MA0GCSqGSIb3DQEBCwUAA4IBAQB3n/LAP3kfvoLs7rkUPjpMl6Pazf++EoV4fJrT 13 | 9VyO1Gh1pwKDtVewS0CaEcvwkpgdY80zB8tQhshiXEMjBwb7qhJGuFLnSLwYT7Qr 14 | gdN/x5dS0CjwW2Afyo/wnNdKf6Xa9dMq1X2pX2Hr7sJxQej/Jv8cXbFWUPuN74GF 15 | pTxKqqDnza3+PWEKv1kDL0Xc7DAZ1xYIZ8Dk+M633HgYdYMt4Lm/RBif2/++x/Wu 16 | P5pWgdCe8cUT8DJFzBC4OacDtcC7FEne/QyoPM3qLF9Fv53Q39vmXsxESC20nmMo 17 | gdy8q0YlRhjI2xLGZvSuqXfdQZE0pR6oAraH9j0ElqdVQy6w 18 | -----END CERTIFICATE REQUEST----- 19 | -------------------------------------------------------------------------------- /C_webserver/http/SSL/server_domain/server.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/http/SSL/server_domain/server.p12 -------------------------------------------------------------------------------- /C_webserver/http/TCP.c: -------------------------------------------------------------------------------- 1 | #include "TCP.h" 2 | #include 3 | #include 4 | 5 | SockAddr_In CreateSocketAddr_IN(char *ip, unsigned short int port) 6 | { 7 | SockAddr_In sockaddr; 8 | sockaddr.sin_family = AF_INET; // IPV4 9 | sockaddr.sin_port = htons(port); 10 | if(ip!=NULL) 11 | { 12 | sockaddr.sin_addr.s_addr = inet_addr(ip); 13 | } 14 | else 15 | { 16 | sockaddr.sin_addr.s_addr = INADDR_ANY; 17 | } 18 | 19 | bzero(&(sockaddr.sin_zero), 8); // 填充位清零 20 | return sockaddr; 21 | } 22 | 23 | Socket InitSocketServer(char *ip, unsigned short int port, int maxListen) 24 | { 25 | Socket sock; 26 | // 初始化 27 | sock.ctx = NULL; 28 | sock.isHttps = false; 29 | sock.ssl = NULL; 30 | 31 | sock.sockId = socket(AF_INET, SOCK_STREAM, 0); 32 | if(sock.sockId < 0) 33 | { 34 | #ifdef OUTPUT_ERROR_INFOR 35 | printf("套接字创建失败\n"); 36 | #endif 37 | sock.sockId = -1; 38 | return sock; 39 | } 40 | 41 | sock.address = CreateSocketAddr_IN(ip, port); 42 | sock.addressLength = sizeof(SockAddr); 43 | if (bind(sock.sockId, (SockAddr *)&(sock.address),sock.addressLength) < 0) 44 | { 45 | #ifdef OUTPUT_ERROR_INFOR 46 | printf("端口绑定失败\n"); 47 | #endif 48 | sock.sockId = -2; 49 | return sock; 50 | } 51 | 52 | if(listen(sock.sockId, maxListen) < 0) 53 | { 54 | #ifdef OUTPUT_ERROR_INFOR 55 | printf("设置监听失败\n"); 56 | #endif 57 | sock.sockId = -3; 58 | return sock; 59 | } 60 | 61 | return sock; 62 | } 63 | 64 | Socket AcceptClientSocket(Socket serverSocket, Bool isHttps) 65 | { 66 | Socket sock; 67 | sock.isHttps = isHttps; 68 | sock.ssl = NULL; // SSL字段初始化为NULL 69 | sock.ctx = NULL; 70 | sock.addressLength = sizeof(SockAddr); 71 | 72 | #ifdef OUTPUT_DEBUG_INFO 73 | printf("开始监听客户端连接\n"); 74 | #endif 75 | 76 | sock.sockId = accept(serverSocket.sockId, (SockAddr*)&(sock.address), &(sock.addressLength)); 77 | if(sock.sockId<0) 78 | { 79 | #ifdef OUTPUT_ERROR_INFOR 80 | printf("客户端连接出错,套接字返回值:%d\n", sock.sockId); 81 | #endif 82 | } 83 | 84 | if(isHttps) 85 | { 86 | sock.ctx = InitSSL(); 87 | sock.ssl = AttachSSLWithSocket(sock.sockId, sock.ctx); 88 | } 89 | 90 | return sock; 91 | } 92 | 93 | int CloseSocket(Socket sock) 94 | { 95 | if(sock.isHttps) 96 | { 97 | FreeSSL(sock.ssl, sock.ctx); 98 | sock.ssl = NULL; 99 | sock.ctx = NULL; 100 | 101 | return 0; 102 | } 103 | else 104 | { 105 | // http的socket 106 | if(sock.sockId>0) 107 | { 108 | if (close(sock.sockId) < 0) 109 | { 110 | #ifdef OUTPUT_ERROR_INFOR 111 | printf("关闭套接字失败,错误信息: %s\n", strerror(errno)); 112 | #endif 113 | return -1; // 失败 114 | } 115 | else 116 | { 117 | sock.sockId = -10; 118 | return 1; // 成功 119 | } 120 | } 121 | else 122 | { 123 | #ifdef OUTPUT_ERROR_INFOR 124 | printf("关闭套接字不存在\n"); 125 | #endif 126 | return 0; 127 | } 128 | } 129 | } 130 | 131 | int RecvDataByFlag(Socket sock, char *data, int maxBuffer, char *endFlag, int alarm) 132 | { 133 | int startTime = time(NULL); // 程序开始时间戳,单位为s 134 | 135 | memset(data, 0, maxBuffer); 136 | char ch = '\0', *p = data, *flag = endFlag; 137 | 138 | // 开始读取数据 139 | while (1) 140 | { 141 | if (*flag == '\0') 142 | { 143 | *p = '\0'; 144 | return (int)(p-data); // 结束读取 145 | } 146 | 147 | int length = read_sock(sock, &ch, 1); 148 | if(length<0) 149 | { 150 | return -1; 151 | } 152 | 153 | if (length == 0 && (time(NULL) - startTime > alarm) && alarm>0) 154 | { 155 | // 超时未读取到数据,且已经超过最大alarm时,断开TCP连接 156 | CloseSocket(sock); 157 | return -3; 158 | } 159 | 160 | if ((p - data) >= maxBuffer - 1) 161 | { 162 | // 对于空头判断 163 | if(strlen(data)<=0) 164 | { 165 | #ifdef OUTPUT_ERROR_INFOR 166 | printf("等候头部时对方主动退出\n"); 167 | #endif 168 | data[0] = '\0'; 169 | return -2; 170 | } 171 | 172 | #ifdef OUTPUT_ERROR_INFOR 173 | data[maxBuffer] = '\0'; 174 | printf("Read()读取时缓冲区太小,未能在\"%s\"之前返回,当前buffer size为: %d, 已经读取的数据为:%s\n", endFlag, maxBuffer - 1, data); 175 | #endif 176 | return -4; 177 | } 178 | 179 | *p = ch; 180 | p++; 181 | 182 | // 开始读取 183 | if (ch == *flag) 184 | { 185 | flag++; 186 | } 187 | else 188 | { 189 | flag = endFlag; 190 | } 191 | } 192 | } 193 | 194 | int RecvDataByLength(Socket sock, char *data, int length, int alarm) 195 | { 196 | int startTime = time(NULL); // 程序开始时间戳,单位为s 197 | 198 | if(length <= 0) 199 | { 200 | return -4; 201 | } 202 | 203 | memset(data, 0, length+1); 204 | int recvLength = recv_sock(sock, data, length, MSG_WAITALL); // 等待所有数据到达,否则阻塞 205 | if (recvLength < 0) 206 | { 207 | #ifdef OUTPUT_ERROR_INFOR 208 | printf("RecvDataByLength: Recv()发生错误\n"); 209 | #endif 210 | return -1; 211 | } 212 | else if (recvLength == 0 && (time(NULL) - startTime > alarm) && alarm > 0) 213 | { 214 | // 未接收到数据,且超时 215 | CloseSocket(sock); 216 | return -3; 217 | } 218 | else if (recvLength == 0) 219 | { 220 | // 对方断开 221 | return -2; 222 | } 223 | return recvLength; 224 | } 225 | 226 | int SendData(Socket sock, char *data, int dataLength, Bool allowchunked, Bool SendEndFlag) 227 | { 228 | if(!allowchunked) 229 | { 230 | if (write_sock(sock, data, dataLength) < 0) 231 | { 232 | return -1; 233 | } 234 | } 235 | else 236 | { 237 | char *p = data; 238 | while (1) 239 | { 240 | if((p-data)>=dataLength) 241 | { 242 | // 发送完成 243 | if(SendEndFlag) 244 | { 245 | if(SendChunkEndFlag(sock)<0) 246 | { 247 | return -1; 248 | } 249 | } 250 | return 0; 251 | } 252 | 253 | char OctData[17]; // 块长度不应该超过8字节表示范围 254 | memset(OctData, 0, 17); 255 | if((data+dataLength-p)>=MAX_CHUNK_SIZE) 256 | { 257 | sprintf(OctData, "%lx\r\n", (unsigned long int)MAX_CHUNK_SIZE); 258 | write_sock(sock, OctData, strlen(OctData)); // 写入长度 259 | 260 | if (write_sock(sock, p, MAX_CHUNK_SIZE) < 0) 261 | { 262 | return -1; 263 | } 264 | p += MAX_CHUNK_SIZE; 265 | } 266 | else 267 | { 268 | sprintf(OctData, "%lx\r\n", data + dataLength - p); 269 | write_sock(sock, OctData, strlen(OctData)); // 写入长度 270 | 271 | if (write_sock(sock, p, data + dataLength - p) < 0) 272 | { 273 | return -1; 274 | } 275 | 276 | p += data + dataLength - p; 277 | } 278 | 279 | // 写入块尾部 280 | if (write_sock(sock, "\r\n", 2) < 0) 281 | { 282 | return -1; 283 | } 284 | } 285 | } 286 | return 0; 287 | } 288 | 289 | int SendFile(Socket sock, char *path, Bool allowchunked, Bool SendEndFlag) 290 | { 291 | FILE *fp = fopen(path, "rb"); 292 | if (fp == NULL) 293 | { 294 | #ifdef OUTPUT_ERROR_INFOR 295 | printf("发送文件时,打开文件出错,文件名: %s\n", path); 296 | #endif 297 | return -1; 298 | } 299 | 300 | int fileLength = GetFileLength(path); 301 | 302 | unsigned char buffer[MAX_CHUNK_SIZE]; 303 | int sendedLength = 0, len=0; 304 | while (1) 305 | { 306 | // 判断文件结束 307 | if(feof(fp) || sendedLength>=fileLength) 308 | { 309 | if (allowchunked) 310 | { 311 | // 发送完成 312 | if (SendEndFlag) 313 | { 314 | if (SendChunkEndFlag(sock) < 0) 315 | { 316 | return -1; 317 | } 318 | } 319 | } 320 | break; 321 | } 322 | 323 | memset(buffer, 0, MAX_CHUNK_SIZE); 324 | if ((fileLength - sendedLength) >= MAX_CHUNK_SIZE) 325 | { 326 | fread(buffer, sizeof(unsigned char), MAX_CHUNK_SIZE, fp); 327 | len = MAX_CHUNK_SIZE; 328 | } 329 | else 330 | { 331 | fread(buffer,1, fileLength - sendedLength, fp); 332 | len = fileLength - sendedLength; 333 | } 334 | 335 | if(allowchunked) 336 | { 337 | // 打印数据长度 338 | char OctData[17]; // 块长度不应该超过8字节表示范围 339 | memset(OctData, 0, 17); 340 | sprintf(OctData, "%x\r\n", len); 341 | write_sock(sock, OctData, strlen(OctData)); // 写入长度 342 | //printf("传送头部: %s", OctData ); 343 | } 344 | 345 | if(len>0) 346 | { 347 | write_sock(sock, buffer, len); // 发送数据 348 | sendedLength += len; 349 | len = 0; 350 | if (allowchunked) 351 | { 352 | write_sock(sock, "\r\n", 2); 353 | } 354 | } 355 | 356 | 357 | #ifdef OUTPUT_DEBUG_INFO 358 | //printf("传送正文: %s",buffer); 359 | #endif 360 | } 361 | 362 | fclose(fp); 363 | return 0; 364 | } 365 | 366 | int SendChunkEndFlag(Socket sock) 367 | { 368 | if (write_sock(sock, "0\r\n\r\n", 5) < 0) 369 | { 370 | return - 1; 371 | } 372 | 373 | return 0; 374 | } 375 | 376 | char* RecvOneChunk(Socket sock,unsigned long int* dataLength) 377 | { 378 | // 读取有效数据长度 379 | char len[18]; 380 | memset(len, 0, 18); 381 | 382 | char *p = len; 383 | while (1) 384 | { 385 | if (read_sock(sock, p, 1) < 0) 386 | { 387 | return NULL; 388 | } 389 | 390 | if((p-len)>=18) 391 | { 392 | // 溢出 393 | return NULL; 394 | } 395 | 396 | if((p-len)>=1 && *p=='\n' && *(p-1)=='\r') 397 | { 398 | *(p - 1) = '\0'; 399 | break; //读取长度完成 400 | } 401 | 402 | p++; 403 | } 404 | 405 | sscanf(len, "%lx", dataLength); 406 | 407 | // 读取有效数据 408 | char ch = '\0'; 409 | char *data = (char *)malloc(sizeof(char) * (*dataLength+1)); 410 | if(data==NULL) 411 | { 412 | return NULL; 413 | } 414 | 415 | for (int i = 0; i < *dataLength; i++) 416 | { 417 | if(*dataLength==0) 418 | { 419 | break; 420 | } 421 | 422 | if (read_sock(sock, &ch, 1) < 0) 423 | { 424 | free(data); 425 | return NULL; 426 | } 427 | data[i] = ch; 428 | } 429 | 430 | data[*dataLength] = '\0'; 431 | 432 | char flag1 = '\0', flag2 = '\0'; 433 | if (read_sock(sock, &flag1, 1) < 0) 434 | { 435 | free(data); 436 | return NULL; 437 | } 438 | 439 | if (read_sock(sock, &flag2, 1) < 0) 440 | { 441 | free(data); 442 | return NULL; 443 | } 444 | 445 | if(!(flag1=='\r'&& flag2=='\n')) 446 | { 447 | free(data); 448 | return NULL; // 块结束不正确 449 | } 450 | 451 | return data; 452 | } 453 | 454 | int write_sock(Socket sock, char *buffer, int bufferSize) 455 | { 456 | if(sock.isHttps) 457 | { 458 | if (sock.ssl == NULL) 459 | { 460 | return -1; 461 | } 462 | return SSL_write(sock.ssl, buffer, bufferSize); 463 | } 464 | else 465 | { 466 | return write(sock.sockId, buffer, bufferSize); 467 | } 468 | } 469 | 470 | int read_sock(Socket sock, char *buffer, int bufferSize) 471 | { 472 | if (sock.isHttps) 473 | { 474 | if(sock.ssl==NULL) 475 | { 476 | return -1; 477 | } 478 | return SSL_read(sock.ssl, buffer, bufferSize); 479 | } 480 | else 481 | { 482 | return read(sock.sockId, buffer, bufferSize); 483 | } 484 | } 485 | 486 | int recv_sock(Socket sock, char *buffer, int size, int flag) 487 | { 488 | int MAX_WAIT_TIME = 30; // 最大阻塞30s 489 | 490 | if (sock.isHttps) 491 | { 492 | if (sock.ssl == NULL) 493 | { 494 | return -1; 495 | } 496 | 497 | if(flag==MSG_WAITALL) 498 | { 499 | int length = 0; 500 | unsigned long int startTime = time(NULL); 501 | while (1) 502 | { 503 | if(length>=size) 504 | { 505 | return length; 506 | } 507 | 508 | int len = SSL_read(sock.ssl, buffer + length, size - length); 509 | length += len; 510 | 511 | if (len < 0) 512 | { 513 | return -1; 514 | } 515 | else if(len==0 && (time(NULL)-startTime)>MAX_WAIT_TIME) 516 | { 517 | // 超时 518 | return 0; 519 | } 520 | } 521 | } 522 | else 523 | { 524 | return SSL_read(sock.ssl, buffer, size); 525 | } 526 | 527 | } 528 | else 529 | { 530 | return recv(sock.sockId, buffer, size, flag); 531 | } 532 | } -------------------------------------------------------------------------------- /C_webserver/http/WebServer.c: -------------------------------------------------------------------------------- 1 | #include "WebServer.h" 2 | 3 | int RunHttpServer(char *ip, int port, int maxListener) 4 | { 5 | RunWebServer(ip, port, maxListener, HTTP); 6 | } 7 | 8 | int RunHttpsServer(char *ip, int port, int maxListener) 9 | { 10 | RunWebServer(ip, port, maxListener, HTTPS); 11 | } 12 | 13 | int RunWebServer(char *ip, int port, int maxListener, HTTP_KIND flag) 14 | { 15 | Socket serverSocket = InitSocketServer(ip, port, maxListener); 16 | if (serverSocket.sockId < 0) 17 | { 18 | #ifdef OUTPUT_DEBUG_INFO 19 | if (flag == HTTP) 20 | { 21 | printf("HTTP server Socket初始化出错\n"); 22 | } 23 | else 24 | { 25 | printf("HTTPS server Socket初始化出错\n"); 26 | } 27 | #endif 28 | 29 | return -1; // 程序发生错误 30 | } 31 | 32 | #ifdef OUTPUT_DEBUG_INFO 33 | if(flag==HTTP) 34 | { 35 | printf("HTTP server:%d 启动成功,进程pid= %d\n",port, getpid()); 36 | } 37 | else 38 | { 39 | printf("HTTPS server %d 启动成功,进程pid= %d\n",port, getpid()); 40 | } 41 | #endif 42 | 43 | while (ALLOW_ACCEPT) 44 | { 45 | Socket clientSocket = AcceptClientSocket(serverSocket, flag==HTTPS?true:false); 46 | if (clientSocket.sockId < 0) 47 | { 48 | #ifdef OUTPUT_DEBUG_INFO 49 | printf("客户端套接字错误\n"); 50 | #endif 51 | continue; //出错 52 | } 53 | 54 | if(clientSocket.isHttps && clientSocket.ssl==NULL) 55 | { 56 | #ifdef OUTPUT_DEBUG_INFO 57 | printf("HTTPS监听Socket发生错误,未创建进程\n"); 58 | #endif 59 | continue; // https初始化出错 60 | } 61 | 62 | int pid = fork(); 63 | if (!pid) 64 | { 65 | close(serverSocket.sockId); 66 | // 子进程处理模块 67 | DealWithRequest(clientSocket); 68 | #ifdef OUTPUT_DEBUG_INFO 69 | printf("子进程: %d 退出\n", getpid()); 70 | #endif 71 | exit(0); 72 | } 73 | 74 | // 安全代码,以防前面代码bug,额外做安全判断 75 | if (pid == 0) 76 | { 77 | // 这段代码理论上不会执行 78 | exit(0); 79 | } 80 | 81 | // 不能关闭SSL,会导致子进程SSL失效 82 | //close(clientSocket.sockId); 83 | clientSocket.ctx = NULL; 84 | clientSocket.ssl = NULL; 85 | 86 | // 父进程 87 | #ifdef OUTPUT_DEBUG_INFO 88 | if (flag == HTTP) 89 | { 90 | printf("HTTP建立连接成功: ip= %s , port= %d ,创建子进程pid=%d\n", inet_ntoa(clientSocket.address.sin_addr), ntohs(clientSocket.address.sin_port), pid); 91 | } 92 | else 93 | { 94 | printf("HTTPS建立连接成功: ip= %s , port= %d ,创建子进程pid=%d\n", inet_ntoa(clientSocket.address.sin_addr), ntohs(clientSocket.address.sin_port), pid); 95 | } 96 | #endif 97 | } 98 | } -------------------------------------------------------------------------------- /C_webserver/http/filesystem.c: -------------------------------------------------------------------------------- 1 | #include"filesystem.h" 2 | 3 | 4 | int createfile(char *name,struct Request* req){ 5 | struct FileInfo* rst; 6 | FILE *fp; 7 | int len; 8 | char* actpath; 9 | 10 | actpath = (char*)malloc(strlen(FILEDIR2)+strlen(name)+1); 11 | memset(actpath,0,strlen(FILEDIR2)+strlen(name)+1); 12 | memcpy(actpath,FILEDIR2,strlen(FILEDIR2)); 13 | memcpy(actpath+strlen(FILEDIR2),name,strlen(name)); 14 | 15 | fp = fopen(actpath,"w"); 16 | if(fp==NULL) return false; 17 | 18 | if(memcmp(req->Encoding,"chunked",7)==0){ 19 | Socket sock = *((Socket*)req->bodyptr); 20 | char* entry; 21 | size_t entrylen; 22 | while(1){ 23 | entry = RecvOneChunk(sock,&entrylen); 24 | if(entry<=0) {free(entry);break;} 25 | fwrite(entry,entrylen,1,fp); 26 | free(entry); 27 | } 28 | }else{ 29 | fwrite(req->contentptr,atol(req->contentLength),1,fp); 30 | } 31 | fclose(fp); 32 | free(actpath); 33 | return true; 34 | } 35 | 36 | struct FileInfo* file2body(char *path){ 37 | //错误则返回NULL,可能需要响应错误码 38 | //记得free 39 | struct FileInfo* rst; 40 | FILE *fp; 41 | int len; 42 | 43 | //if(access(path, F_OK)!= 0) return NULL; 44 | 45 | char* actpath; 46 | if(strlen(path)<=1){ 47 | actpath = (char*)malloc(strlen(FILEDIR)+strlen(dfpage)+1); 48 | memset(actpath,0,strlen(FILEDIR)+strlen(dfpage)+1); 49 | memcpy(actpath,FILEDIR,strlen(FILEDIR)); 50 | memcpy(actpath+strlen(FILEDIR),dfpage,strlen(dfpage)); 51 | }else{ 52 | actpath = (char*)malloc(strlen(FILEDIR)+strlen(path)+1); 53 | memset(actpath,0,strlen(FILEDIR)+strlen(path)+1); 54 | memcpy(actpath,FILEDIR,strlen(FILEDIR)); 55 | memcpy(actpath+strlen(FILEDIR),path,strlen(path)); 56 | } 57 | 58 | fp = fopen(actpath,"r"); 59 | if(fp==NULL) return NULL; 60 | fseek(fp,0,SEEK_END); 61 | len = ftell(fp); 62 | if(len<=0) return NULL; 63 | rst = (struct FileInfo*)malloc(sizeof(struct FileInfo)); 64 | getType(actpath,rst->type); 65 | rst->len = len; 66 | if(len>=chunkborder) rst->chunked = true; 67 | else rst->chunked = false; 68 | rst->fpath = actpath; 69 | return rst; 70 | } 71 | 72 | int GetFileLength(char *path) 73 | { 74 | FILE *fp = fopen(path, "rb"); 75 | if(fp==NULL) 76 | { 77 | #ifdef OUTPUT_ERROR_INFOR 78 | printf("打开客户端请求文件出错,文件名为%s\n",path); 79 | #endif 80 | return -1; 81 | } 82 | 83 | fseek(fp, 0, SEEK_END); 84 | int length = ftell(fp); 85 | 86 | fclose(fp); 87 | return length; 88 | } 89 | 90 | int EndWithString(char *str1, char *str2) 91 | { 92 | if(strlen(str1)= path)) 110 | { 111 | p--; 112 | } 113 | 114 | p++; 115 | while(*p!='\0') 116 | { 117 | *result = *p; 118 | result++; 119 | p++; 120 | } 121 | *result = '\0'; 122 | } 123 | 124 | void getType(char* file_name,char* extension){ 125 | char* tmp = strstr(file_name,"."); 126 | if(tmp==NULL) return; 127 | size_t len = strlen(file_name); 128 | size_t bias = tmp-file_name; 129 | memcpy(extension,tmp+1,len-bias); 130 | } -------------------------------------------------------------------------------- /C_webserver/http/includes/Http.h: -------------------------------------------------------------------------------- 1 | #ifndef HTTP_H 2 | #define HTTP_H 3 | 4 | #include 5 | #include 6 | #include"global.h" 7 | #include"request.h" 8 | #include"response.h" 9 | #include"pipe.h" 10 | #include"filesystem.h" 11 | #include "TCP.h" 12 | 13 | typedef enum HttpKind 14 | { 15 | Error_400, 16 | Error_404, 17 | Error_500, 18 | Error_501, 19 | Success_200 20 | } HttpKind; 21 | 22 | typedef struct Eventarg{ 23 | struct event_base* base; 24 | struct event* event; 25 | Socket* sock; 26 | int firsttime; 27 | } Eventarg; 28 | 29 | void accept_cb(int fd, short events, void* arg); 30 | void close_cb(int fd, short events, void* arg); 31 | int DealWithRequest(Socket sock); // 成功时返回0,存在错误返回-1 32 | int ReadHttpHeaderBytes(Socket sock, char *data, int maxBuffer); 33 | 34 | void printRequest(struct Request* req); 35 | void printResponse(struct Block* block); 36 | 37 | void freeRequest(struct Request* req); 38 | void freeResponse(struct FinalResponse* res); 39 | void freeFileinfo(struct FileInfo* fi); 40 | void freeBlock(struct Block* block); 41 | 42 | void sendResponse(struct Block* block, Socket sock); 43 | void CloseHttp(Eventarg* eventarg); 44 | 45 | int ResponseHttpWithHtml(Socket sock, HttpKind httpKind, char *htmlPath); 46 | int ResponseHttp(Socket sock, char *contentType, char *filePath, Bool allowChunked); 47 | 48 | #endif -------------------------------------------------------------------------------- /C_webserver/http/includes/SSL.h: -------------------------------------------------------------------------------- 1 | #ifndef SSL_H 2 | #define SSL_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include"global.h" 8 | 9 | // #define CERTF "SSL/server/server-cert.pem" 10 | // #define KEYF "SSL/server/server-key.pem" 11 | // #define CAFILE "SSL/ca/ca-cert.pem" 12 | 13 | #define CERTF "SSL/server_domain/server-cert.pem" 14 | #define KEYF "SSL/server_domain/server-key.pem" 15 | #define CAFILE "SSL/ca/ca-cert.pem" 16 | 17 | SSL_CTX* InitSSL(); 18 | SSL* AttachSSLWithSocket(int sockId, SSL_CTX* ctx); 19 | Bool VerifyX509(SSL* ssl); 20 | void FreeSSL(SSL *ssl, SSL_CTX *ctx); 21 | 22 | #endif -------------------------------------------------------------------------------- /C_webserver/http/includes/TCP.h: -------------------------------------------------------------------------------- 1 | #ifndef TCP_H 2 | #define TCP_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | #include "SSL.h" 19 | #include"global.h" 20 | #include"filesystem.h" 21 | 22 | #define MAX_CHUNK_SIZE 1024 23 | 24 | // 定义别名 25 | typedef struct sockaddr SockAddr; 26 | typedef struct sockaddr_in SockAddr_In; 27 | 28 | // 套接字结构体 29 | typedef struct Socket 30 | { 31 | int sockId; // socket id 32 | struct sockaddr_in address; // socket 地址 33 | int addressLength; // 一般等于sizeof(SockAddr),由accept函数赋值 34 | SSL* ssl; // 非NULL时指向SSL相关内容 35 | SSL_CTX *ctx; 36 | Bool isHttps; 37 | } Socket; 38 | 39 | /******************************************************************************** 40 | * 功能:创建一个套接字地址 41 | * 42 | * ip:C语言类型数组,当指定为NULL时表示INADDR_ANY 43 | * port: 端口号 44 | * 返回值: 套接字地址 45 | ************************************************************************* ******/ 46 | SockAddr_In CreateSocketAddr_IN(char *ip, unsigned short int port); 47 | 48 | /******************************************************************************** 49 | * 功能:初始化一个Socket Server 50 | * ip: C语言类型数组,当指定为NULL时表示INADDR_ANY 51 | * port: 端口号 52 | * maxListen: 最大监听数目 53 | * 返回值: 监听Socket结构。套接字创建失败:Socket.sockId=-1; 端口绑定失败:Socket.sockId=-2; 设置监听失败:Socket.sockId=-2 54 | * ************************************************************************* ***/ 55 | Socket InitSocketServer(char* ip, unsigned short int port, int maxListen); // 创建监听套接字并绑定端口 56 | 57 | /******************************************************************************** 58 | * 功能:接受客户端连接,内部会阻塞 59 | * 60 | * serverSocket: 监听Socket结构 61 | * isHttps: 是否是Https服务器,true/false 62 | * 返回值:客户端Socket结构 63 | * ************************************************************************* ***/ 64 | Socket AcceptClientSocket(Socket serverSocket, Bool isHttps); 65 | 66 | /******************************************************************************** 67 | * 功能:关闭套接字 68 | * 69 | * sock: 等待关闭的Socket 70 | * 返回值: 成功:1 , 套接字已过期:0 , 失败:-1 71 | * ************************************************************************* ***/ 72 | int CloseSocket(Socket sock); 73 | 74 | /******************************************************************************** 75 | * 功能:基于TCP读取字节流,会在末尾额外添加'\0',但不保证有用,通过特定字符串判断结束 76 | * 77 | * sock: 客户端Socket 78 | * data: 存放数据的缓冲区 79 | * maxBuffer: 缓冲区大小,应额外多出一个字节 80 | * endFlag: C语言字符串,结束标志 81 | * alarm: TCP超时未返回数据,且超过alarm时,自动关闭套接字,返回-3。alarm<=0时无效 82 | * 返回值: 成功:有效数据长度;读取发生错误:-1 客户端主动断开连接:-2 超时:-3 缓冲区溢出:-4 83 | * ************************************************************************* ***/ 84 | int RecvDataByFlag(Socket sock, char *data, int maxBuffer,char *endFlag, int alarm); 85 | 86 | /******************************************************************************** 87 | * 功能:基于TCP读取指定长度字节流 88 | * 89 | * sock: 客户端Socket 90 | * data: 存放数据的缓冲区 91 | * length: 期望读取的数据长度 92 | * alarm: TCP超时未返回数据,且超过alarm时,自动关闭套接字,返回-3。alarm<=0时无效 93 | * 返回值: 成功:有效数据长度; 读取发生错误:-1 客户端主动断开连接:-2 超时:-3 读取长度无效:-4 94 | * ************************************************************************* ***/ 95 | int RecvDataByLength(Socket sock, char *data, int length, int alarm); 96 | 97 | /******************************************************************************** 98 | * 功能:基于TCP在chunked模式下,从Socket缓冲区读取一个块的有效内容,为malloc分配的内存,应!!显式释放!!尾部额外添加'\0',但不保证有用 99 | * sock: 客户端Socket 100 | * dataLength: 返回有效数据长度 101 | * 返回值: 成功:堆区指针,指向有效数据 出错:NULL 102 | * ************************************************************************* ***/ 103 | char *RecvOneChunk(Socket sock, unsigned long int *dataLength); 104 | 105 | /******************************************************************************** 106 | * 功能:基于TCP发送字节数组 107 | 108 | * sock: 客户端Socket 109 | * data: 数组首地址 110 | * datalength:数据长度 111 | * allowChunk:是否使用分块,使用true/false 112 | * sendEndFlag:结尾是否发送分块结束标志"0\r\n\r\n",使用true/false 113 | * 返回值: 成功:0 出错:-1 114 | * ************************************************************************* ***/ 115 | int SendData(Socket sock, char *data, int dataLength, Bool allowchunked, Bool SendEndFlag); 116 | 117 | /******************************************************************************** 118 | * 功能:基于TCP以二进制读取方式,将磁盘文件发送到套接字内核缓冲区 119 | * 120 | * sock: 客户端Socket 121 | * data: C字符串,文件路径 122 | * allowChunk:是否使用分块,使用true/false 123 | * sendEndFlag:结尾是否发送分块结束标志"0\r\n\r\n",使用true/false 124 | * 返回值: 成功:0 出错:-1 125 | ************************************************************************* ***/ 126 | int SendFile(Socket sock, char *path, Bool allowchunked, Bool SendEndFlag); 127 | 128 | /******************************************************************************** 129 | * 功能:在分块传输时,用于在结尾发送结束标志"0\r\n\r\n" 130 | * 131 | * sock: 客户端Socket 132 | * 返回值: 成功:0 出错:-1 133 | ************************************************************************* ***/ 134 | int SendChunkEndFlag(Socket sock); 135 | 136 | /******************************************************************************** 137 | * 功能:对socket write的封装,自适应HTTP/HTTPS 138 | ************************************************************************* ***/ 139 | int write_sock(Socket sock,char* buffer, int bufferSize); 140 | 141 | /******************************************************************************** 142 | * 功能:对socket recv的封装,自适应HTTP/HTTPS 143 | * flag: 仅实现了MSG_WAITALL和0的支持 144 | ************************************************************************* ***/ 145 | int recv_sock(Socket sock, char *buffer, int size, int flag); 146 | 147 | /******************************************************************************** 148 | * 功能:对socket read的封装,自适应HTTP/HTTPS 149 | ************************************************************************* ***/ 150 | int read_sock(Socket sock, char *buffer, int bufferSize); 151 | 152 | #endif 153 | 154 | /************************************* 155 | struct sockaddr 156 | { 157 | unsigned short int sa_family; 158 | char sa_data[14]; 159 | }; 160 | 161 | struct socketaddr_in 162 | { 163 | unsigned short int sin_family; 164 | uint16_t sin_port; 165 | struct in_addr sin_addr; 166 | unsigned char sin_zero[8]; 167 | }; 168 | ***************************************/ -------------------------------------------------------------------------------- /C_webserver/http/includes/WebServer.h: -------------------------------------------------------------------------------- 1 | #ifndef WEBSERVER_H 2 | #define WEBSERVER_H 3 | 4 | #include "TCP.h" 5 | #include "Http.h" 6 | #include"global.h" 7 | #include "SSL.h" 8 | 9 | #define ALLOW_ACCEPT 1 10 | #define HTTP_KIND int 11 | #define HTTP 0 12 | #define HTTPS 1 13 | 14 | int RunWebServer(char *ip, int port, int maxListener, HTTP_KIND flag); 15 | int RunHttpServer(char *ip, int port, int maxListener); 16 | int RunHttpsServer(char *ip, int port, int maxListener); 17 | 18 | #endif -------------------------------------------------------------------------------- /C_webserver/http/includes/filesystem.h: -------------------------------------------------------------------------------- 1 | #ifndef _FILESYSTEM_H_ 2 | #define _FILESYSTEM_H_ 3 | 4 | #include"global.h" 5 | #include"response.h" 6 | #include"request.h" 7 | #include"TCP.h" 8 | 9 | int createfile(char *name,struct Request* req); 10 | 11 | struct FileInfo* file2body(char *path); 12 | 13 | int GetFileLength(char* path); 14 | /***************************************************** 15 | * 功能:返回一个磁盘文件的字节长度 16 | * 17 | * 返回值:成功时返回字节数,失败返回-1 18 | *****************************************************/ 19 | 20 | int EndWithString(char *str1, char *str2); 21 | 22 | void GetFileName(char *path, char *result); 23 | 24 | void getType(char* file_name,char* extension); 25 | 26 | #endif -------------------------------------------------------------------------------- /C_webserver/http/includes/global.h: -------------------------------------------------------------------------------- 1 | #ifndef _GLOBAL_H_ 2 | #define _GLOBAL_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | #define dflen 100 9 | #define dftypelen 20 10 | #define dfpage "/index.html" 11 | #define FILEDIR "files" 12 | #define FILEDIR2 "files/" 13 | #define rn "\r\n" 14 | #define page 4096 15 | #define chunkborder 800 16 | #define Bool int 17 | #define true 1 18 | #define false 0 19 | #define stateLen 60 20 | #define alivetime 60 21 | 22 | #define OK 200 23 | #define NotFound 404 24 | #define BadRequest 400 25 | #define InternalServerError 500 26 | #define MethodNotAllowed 405 27 | #define NotAcceptable 406 28 | #define RequestURITooLarge 414 29 | #define HTTPVersionnotsupported 505 30 | 31 | #define OUTPUT_ERROR_INFOR //条件编译,决定是否输出错误信息 32 | #define OUTPUT_DEBUG_INFO //条件编译,决定是否打印额外执行输出 33 | 34 | #endif 35 | -------------------------------------------------------------------------------- /C_webserver/http/includes/pipe.h: -------------------------------------------------------------------------------- 1 | #ifndef _PIPE_H_ 2 | #define _PIPE_H_ 3 | 4 | #include"global.h" 5 | #include"request.h" 6 | #include"response.h" 7 | #include"filesystem.h" 8 | 9 | struct Block{ 10 | struct FinalResponse* response; 11 | int connection; 12 | int keepalivetime; 13 | int chunked; 14 | struct FileInfo* fileinfo; 15 | }; 16 | 17 | struct Block* init(struct Request* req); 18 | 19 | struct Block* getfile(struct Request* req, struct Block* block); 20 | struct Block* postfile(struct Request* req, struct Block* block); 21 | 22 | struct Block* connectioncheck(struct Request* req, struct Block* block); 23 | 24 | #endif 25 | //---------------------------------------------------------------------------- 26 | 27 | /* 28 | struct FinalResponse* constructor(struct Request* req); 29 | 30 | struct FinalResponse* addhead(struct FinalResponse* rst,struct AdditionalResponse* ad); 31 | 32 | struct AdditionalResponse* connectioncheck(); 33 | 34 | struct FileInfo* fileattach(char* path); 35 | 36 | */ -------------------------------------------------------------------------------- /C_webserver/http/includes/request.h: -------------------------------------------------------------------------------- 1 | #ifndef _REQUEST_H_ 2 | #define _REQUEST_H_ 3 | 4 | #include"global.h" 5 | 6 | #define typenums 5 7 | 8 | typedef struct Request{ 9 | char method[8]; //only GET or POST 10 | char URL[dflen]; 11 | size_t URLlen; 12 | char version[16]; 13 | 14 | char connection[12]; //Connection: close or Keep-Alive //or Upgrade 15 | char accept[2*dflen]; 16 | char Encoding[12]; 17 | //char accept[2*dflen]; 18 | //char authorization[2*dflen]; 19 | //-------------------------------------------------------------- 20 | char contentLength[16]; //Content-Length: num 21 | char contentType[16]; 22 | char* bodyptr; 23 | char* contentptr; 24 | } Request; 25 | 26 | int headlize(char* ptr); 27 | int headhandler(struct Request* req,size_t slen,char* ptr); 28 | struct Request* phaser(size_t len,char* buffer); 29 | 30 | #endif -------------------------------------------------------------------------------- /C_webserver/http/includes/response.h: -------------------------------------------------------------------------------- 1 | #ifndef _RESPONSE_H_ 2 | #define _RESPONSE_H_ 3 | 4 | #include"global.h" 5 | 6 | struct BasicResponse{ 7 | size_t len; 8 | char state[stateLen]; 9 | //-------------------------------------------------------------- 10 | /* 11 | char connection[12]; //close or keep-alive 12 | char allow[]; //Allow: GET, POST 13 | char keepAlive[20]; //Keep-Alive: ??? 14 | size_t contentLength; //Content-Length: num 15 | char transferEncoding[]; //Transfer-Encoding: chunked 16 | char contentType[]; //Content-Type: string 17 | */ 18 | }; 19 | struct AdditionalResponse{ 20 | size_t len; 21 | char state[dflen]; 22 | }; 23 | struct FinalResponse{ 24 | size_t len; 25 | char *data; 26 | }; 27 | struct FileInfo{ 28 | size_t len; 29 | int chunked; 30 | char type[dftypelen]; 31 | char *fpath; 32 | }; 33 | 34 | 35 | struct BasicResponse* responseFirstLine(int scode,char* description); 36 | struct AdditionalResponse* initResponse(char* key,char* value); 37 | void addResponse(struct FinalResponse* res,struct AdditionalResponse* ar); 38 | void addBasicResponse(struct FinalResponse* res,struct BasicResponse* br); 39 | void addTail(struct FinalResponse* res); 40 | #endif -------------------------------------------------------------------------------- /C_webserver/http/main.c: -------------------------------------------------------------------------------- 1 | #include "TCP.h" 2 | #include "Http.h" 3 | #include"global.h" 4 | #include "WebServer.h" 5 | 6 | #define HTTP_PORT 12345 7 | #define HTTPS_PORT 54321 8 | #define MaxListener 10 9 | #define Max_TRY_TIMES 10 10 | 11 | int main() 12 | { 13 | int pid = fork(); 14 | if(pid!=0) 15 | { 16 | // 父进程, 运行Https服务器 17 | for (int i = 0; i < Max_TRY_TIMES;i++) 18 | { 19 | RunHttpsServer(NULL, HTTPS_PORT, MaxListener); 20 | } 21 | #ifdef OUTPUT_DEBUG_INFO 22 | printf("HTTPS server尝试启动%d次后仍旧失败,放弃启动\n", Max_TRY_TIMES); 23 | #endif 24 | } 25 | else 26 | { 27 | // 子进程,运行http服务器 28 | for (int i = 0; i < Max_TRY_TIMES; i++) 29 | { 30 | RunHttpServer(NULL, HTTP_PORT, MaxListener); 31 | } 32 | #ifdef OUTPUT_DEBUG_INFO 33 | printf("HTTP server尝试启动%d次后仍旧失败,放弃启动\n", Max_TRY_TIMES); 34 | #endif 35 | } 36 | 37 | while(1); 38 | } -------------------------------------------------------------------------------- /C_webserver/http/pipe.c: -------------------------------------------------------------------------------- 1 | #include"pipe.h" 2 | 3 | struct Block* init(struct Request* req){ 4 | if(req==NULL) return NULL; 5 | struct BasicResponse* br = NULL; 6 | struct AdditionalResponse* ar =NULL; 7 | struct Block* rst = NULL; 8 | 9 | rst = (struct Block*)malloc(sizeof(struct Block)); 10 | memset(rst,0,sizeof(struct Block)); 11 | rst->response = (struct FinalResponse*)malloc(sizeof(struct FinalResponse)); 12 | memset(rst->response,0,sizeof(struct FinalResponse)); 13 | rst->response->data = (char*)malloc(page); 14 | memset(rst->response->data,0,page); 15 | 16 | if(memcmp(req->version,"HTTP/1.1",8)!=0){ 17 | //版本不支持 18 | br = responseFirstLine(HTTPVersionnotsupported,"HTTP Version not supported"); 19 | addBasicResponse(rst->response,br); 20 | addTail(rst->response); 21 | return rst; 22 | }else if(memcmp(req->method,"GET",3)==0){ 23 | //GET 24 | rst = getfile(req,rst); 25 | addTail(rst->response); 26 | return rst; 27 | }else if(memcmp(req->method,"POST",4)==0){ 28 | //POST 29 | rst = postfile(req,rst); 30 | addTail(rst->response); 31 | return rst; 32 | }else{ 33 | //不支持的请求方法+Allow字段 34 | br = responseFirstLine(MethodNotAllowed,"Method Not Allowed"); 35 | ar = initResponse("Allow","GET,POST"); 36 | addBasicResponse(rst->response,br); 37 | addResponse(rst->response,ar); 38 | addTail(rst->response); 39 | return rst; 40 | } 41 | return NULL; 42 | } 43 | 44 | struct Block* getfile(struct Request* req, struct Block* block){ 45 | if(req==NULL||block==NULL) return NULL; 46 | struct FileInfo* fi = file2body(req->URL); 47 | struct BasicResponse* br = NULL; 48 | struct AdditionalResponse* ar = NULL; 49 | if(fi!=NULL){ 50 | block->fileinfo = fi; 51 | block->chunked = fi->chunked; 52 | br = responseFirstLine(OK,"OK"); 53 | addBasicResponse(block->response,br); 54 | if(fi->chunked==false){ 55 | ar = initResponse("Content-Type",fi->type); 56 | char tmpnum[20]; 57 | sprintf(tmpnum,"%ld",fi->len); 58 | struct AdditionalResponse* ar1 = initResponse("Content-Length",tmpnum); 59 | addResponse(block->response,ar); 60 | addResponse(block->response,ar1); 61 | }else{ 62 | ar = initResponse("Transfer-Encoding","chunked"); 63 | addResponse(block->response,ar); 64 | } 65 | }else{ 66 | br = responseFirstLine(NotFound,"Not Found"); 67 | ar = initResponse("Content-Length","0"); 68 | addBasicResponse(block->response,br); 69 | addResponse(block->response,ar); 70 | } 71 | connectioncheck(req,block); 72 | return block; 73 | } 74 | 75 | struct Block* postfile(struct Request* req, struct Block* block){ 76 | if(req==NULL||block==NULL) return NULL; 77 | struct BasicResponse* br = NULL; 78 | struct AdditionalResponse* ar = NULL; 79 | char *tmp,*fname; 80 | if(memcmp(req->Encoding,"chunked",7)!=0){ 81 | tmp = req->bodyptr; 82 | fname = strstr(tmp,"filename=")+10; 83 | tmp = strstr(tmp,"\r\n\r\n");tmp = tmp+4; 84 | req->contentptr = tmp; 85 | size_t actlen = tmp - req->bodyptr; 86 | actlen += 46; 87 | actlen = atol(req->contentLength)-actlen; 88 | sprintf(req->contentLength,"%ld",actlen); 89 | tmp = strstr(fname,"\""); 90 | *tmp = '\0'; 91 | printf("[FileName] %s\n",fname); 92 | } 93 | 94 | if(createfile(fname,req)==true){ 95 | br = responseFirstLine(OK,"OK"); 96 | addBasicResponse(block->response,br); 97 | ar = initResponse("Content-Type","text"); 98 | addResponse(block->response,ar); 99 | ar = initResponse("Content-Length","0"); 100 | addResponse(block->response,ar); 101 | }else{ 102 | br = responseFirstLine(NotAcceptable,"Not Acceptable"); 103 | addBasicResponse(block->response,br); 104 | } 105 | connectioncheck(req,block); 106 | return block; 107 | } 108 | 109 | struct Block* connectioncheck(struct Request* req, struct Block* block){ 110 | if(req==NULL||block==NULL) return NULL; 111 | struct AdditionalResponse* ar; 112 | if(memcmp(req->URL,"/favicon.ico",12)==0){ 113 | block->connection = false; 114 | block->keepalivetime = 0; 115 | ar = initResponse("Connection","close"); 116 | addResponse(block->response,ar); 117 | }else if((memcmp(req->connection,"keep-alive",10)==0)||(memcmp(req->connection,"Keep-Alive",10)==0)){ 118 | //keep alive 119 | block->connection = true; 120 | block->keepalivetime = alivetime; 121 | ar = initResponse("Connection","keep-alive"); 122 | addResponse(block->response,ar); 123 | char tmp[6]; 124 | sprintf(tmp,"%d",alivetime); 125 | ar = initResponse("Keep-Alive",tmp); 126 | addResponse(block->response,ar); 127 | }else{ 128 | block->connection = false; 129 | block->keepalivetime = 0; 130 | ar = initResponse("Connection","close"); 131 | addResponse(block->response,ar); 132 | } 133 | return block; 134 | } 135 | 136 | //-------------------------------------------------------------------------------- 137 | /* 138 | struct FinalResponse* constructor(struct Request* req){ 139 | if(req==NULL) return NULL; 140 | FinalResponse* rst = NULL; 141 | BasicResponse* brep = NULL; 142 | AdditionalResponse* addq =NULL; 143 | if(memcmp(req->version,"HTTP/1.1",8)!=0){ 144 | //版本不支持 145 | brep = responseFirstLine(NotAcceptable,"Not Acceptable"); 146 | rst = (FinalResponse*)malloc(sizeof(struct FinalResponse)); 147 | rst->len = brep->len+2; 148 | rst->data = (char*)malloc(rst->len); 149 | memcpy(rst->data,brep->state,brep->len); 150 | memcpy((rst->data)+brep->len,"\r\n",2); 151 | free(brep); 152 | return rst; 153 | } 154 | if(memcmp(req->method,"GET",3)==0){ 155 | //GET 156 | }else if(memcmp(req->method,"POST",4)==0){ 157 | //POST 158 | }else{ 159 | //不支持的请求方法+Allow字段 160 | brep = responseFirstLine(MethodNotAllowed,"Method Not Allowed"); 161 | rst = (FinalResponse*)malloc(sizeof(struct FinalResponse)); 162 | addq = addResponse("Allow","GET,POST"); 163 | rst->data = (char*)malloc(page); 164 | rst->len = brep->len; 165 | memcpy(rst->data,brep->state,brep->len); 166 | } 167 | return NULL; 168 | } 169 | 170 | struct FinalResponse* addhead(struct FinalResponse* rst,struct AdditionalResponse* ad){ 171 | if(rst==NULL) return NULL; 172 | if(ad==NULL) return NULL; 173 | char* tmp = rst->data + rst->len; 174 | memcpy(tmp,add->state,add->len); 175 | rst->len = rst->len+ad->len; 176 | return rst; 177 | } 178 | 179 | struct AdditionalResponse* connectioncheck(); 180 | 181 | struct FileInfo* fileattach(char* path){ 182 | struct FinalResponse* file = body2file(path); 183 | if(file==NULL) return NULL; 184 | struct FileInfo* rst = (struct FileInfo*)malloc(sizeof(struct FileInfo)); 185 | rst->fi = file; 186 | char numlen[20]; 187 | itoa(file->len,numlen,10); 188 | rst->ad = addResponse("Content-Length",&numlen); 189 | return rst; 190 | } 191 | */ -------------------------------------------------------------------------------- /C_webserver/http/request.c: -------------------------------------------------------------------------------- 1 | #include"request.h" 2 | 3 | char* headers[typenums] = {"Connection: ","Accept: ","Content-Length: ","Content-Type: ","Transfer-Encoding: "}; 4 | 5 | int requestFirstline(struct Request* req,char* ptr,size_t len){ 6 | char *tmp = strstr(ptr," "); 7 | if(tmp==NULL||(tmp-ptr)>=8) return -1; 8 | memcpy(req->method,ptr,tmp-ptr); 9 | len -= (tmp-ptr+1); 10 | ptr = tmp+1; 11 | 12 | tmp = strstr(ptr," "); 13 | if(tmp==NULL) return -1; 14 | memcpy(req->URL,ptr,tmp-ptr); 15 | req->URLlen = tmp-ptr; 16 | len -= (tmp-ptr+1); 17 | ptr = tmp+1; 18 | memcpy(req->version,ptr,len); 19 | return 0; 20 | } 21 | 22 | struct Request* phaser(size_t len,char* buffer){ 23 | //return NULL if receive wrong method 24 | char* ptr = buffer; 25 | int slen; 26 | 27 | struct Request* rst = (struct Request*)malloc(sizeof(struct Request)); 28 | memset(rst,0,sizeof(struct Request)); 29 | slen = headlize(ptr); 30 | if(slen<=3){free(rst);return NULL;} 31 | if(requestFirstline(rst,ptr,slen)==-1){ 32 | //Unspport request method 33 | free(rst); 34 | return NULL; 35 | } 36 | ptr = ptr+slen+2; 37 | //----------------------------Phase other headers. 38 | while((slen=headlize(ptr))>0){ 39 | //if(strstr(ptr,headers[i]!=ptr)) continue; 40 | if(headhandler(rst,slen,ptr)==false){ 41 | free(rst); 42 | return NULL; 43 | } 44 | ptr = ptr+slen+2; 45 | } 46 | return rst; 47 | } 48 | 49 | int headlize(char* ptr){ 50 | //extract lines from buffer 51 | int rst = 0; 52 | char* tmp = strstr(ptr,rn); 53 | if(tmp==NULL) return -1; 54 | rst = tmp - ptr; 55 | return rst; 56 | } 57 | 58 | int headhandler(struct Request* req,size_t slen,char* ptr){ 59 | if(memcmp(ptr,headers[0],12)==0) memcpy(req->connection,ptr+12,slen-12); 60 | else if(memcmp(ptr,headers[1],8)==0) memcpy(req->accept,ptr+8,slen-8); 61 | else if(memcmp(ptr,headers[2],16)==0) memcpy(req->contentLength,ptr+16,slen-16); 62 | else if(memcmp(ptr,headers[3],14)==0) memcpy(req->contentType,ptr+14,slen-14); 63 | else if(memcmp(ptr,headers[4],19)==0) memcpy(req->Encoding,ptr+19,slen-19); 64 | return true; 65 | } 66 | -------------------------------------------------------------------------------- /C_webserver/http/response.c: -------------------------------------------------------------------------------- 1 | #include"response.h" 2 | 3 | struct BasicResponse* responseFirstLine(int scode,char* description){ 4 | struct BasicResponse* rst = (struct BasicResponse*)malloc(sizeof(struct BasicResponse)); 5 | sprintf(rst->state,"HTTP/1.1 %d %s\r\n",scode,description); 6 | rst->len = strlen(rst->state); 7 | return rst; 8 | } 9 | 10 | struct AdditionalResponse* initResponse(char* key,char* value){ 11 | struct AdditionalResponse* rst = (struct AdditionalResponse*)malloc(sizeof(struct AdditionalResponse)); 12 | sprintf(rst->state,"%s: %s\r\n",key,value); 13 | rst->len = strlen(rst->state); 14 | return rst; 15 | } 16 | 17 | void addResponse(struct FinalResponse* res,struct AdditionalResponse* ar){ 18 | char* tmp = res->data+res->len; 19 | memcpy(tmp,ar->state,ar->len); 20 | res->len = res->len+ar->len; 21 | free(ar); 22 | } 23 | 24 | void addBasicResponse(struct FinalResponse* res,struct BasicResponse* br){ 25 | memcpy(res->data,br->state,br->len); 26 | res->len = br->len; 27 | free(br); 28 | } 29 | 30 | void addTail(struct FinalResponse* res){ 31 | memcpy(res->data+res->len,"\r\n",2); 32 | res->len = res->len+2; 33 | } -------------------------------------------------------------------------------- /C_webserver/test: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oneflyingfish/WebServer_C/e5b25e413ecbb419dc0c1708995ba84691dad361/C_webserver/test -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WebServer_C 2 | 基于C语言实现一个简易的Web服务器,支持Http和Https(基于OpenSSL的TLS协议) 3 | 4 | ## 开发环境: 5 | * 开发语言:`C (部分测试网页涉及HTML+CSS内容,不影响功能)` 6 | * 开发环境:`Ubuntu 20.04, gcc V9.3.0, OpenSSL 1.1.1` 7 | 8 | ## 功能说明: 9 | * 对HTTP、HTTPS的支持 10 | * Centent-Type的支持(对应Chunked模式) 11 | * 对分块传输的支持 12 | * 文件传输 13 | * 注:在HTTP层,仅完成部分头部协议识别,传输层与SSL层完成了封装,自适应HTTPS与HTTP数据报的传送 14 | 15 | ## 环境复现 16 | ```Bash 17 | sudo apt-get update 18 | sudo apt-get install openssl 19 | sudo apt-get install libssl-dev 20 | sudo apt-get install gcc 21 | ``` 22 | 23 | ## 二进制构建 24 | ```Bash 25 | make 26 | 27 | # 清理项目 28 | make clean 29 | ``` 30 | 31 | ## 开发人员 32 | 此项目为合作项目,由我和曹书瑜共同完成。 33 | 34 | ## 附言 35 | 关于如何创建测试用SSL证书,可参考我的[博客](https://www.aflyingfish.top/articles/d9a29d96e0ce/) 36 | --------------------------------------------------------------------------------