ssl_stat 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7a132b261066eb74ec18e4bfefde74f8ef9c08c84c544a30e69b2a060578894c
4
+ data.tar.gz: cc823ae46ecb3e5cff6728a7a702cc653c2096ebf8f42a39126414cf078c3aaf
5
+ SHA512:
6
+ metadata.gz: 360de91dfdd7d6973b6bfc3444047303d3db60fe63c49fc7031f01f25bcb2369d461cea4a3c787b0048a4bc17d39e25bbf940c027650eb858899f65ea2ed99f5
7
+ data.tar.gz: b4aba70a6b94cc356eea54eb9d5b06c857382568de7c36c0b42c3d972e96a9c8074395d7e76dca89b4798f7922c09ebc72e275015ced3960500d44d2eca952de
@@ -0,0 +1,8 @@
1
+ require 'mkmf'
2
+
3
+ extension_name = 'ssl_stat'
4
+ dir_config extension_name
5
+
6
+ $LOCAL_LIBS << " -lcurl"
7
+
8
+ create_makefile extension_name
@@ -0,0 +1,118 @@
1
+ #include "ruby.h"
2
+ #include <stdio.h>
3
+ #include <stdlib.h>
4
+ #include <curl/curl.h>
5
+ #include <string.h>
6
+
7
+ char *get_second_part(char *str) {
8
+ char * token = strtok(str, ":");
9
+ token = strtok(NULL, ":");
10
+ return token;
11
+ }
12
+
13
+ char *get_datetime(char *str) {
14
+ char * retstr = (char *) malloc(30);
15
+ char * token = strtok(str, ":");
16
+ strcpy(retstr, "");
17
+ int ignore_first = 1;
18
+ while( token != NULL ) {
19
+ if (ignore_first) {
20
+ ignore_first = 0;
21
+ token = strtok(NULL, " ");
22
+ continue;
23
+ }
24
+ strcat(retstr, token);
25
+ strcat(retstr, " ");
26
+ token = strtok(NULL, " ");
27
+ }
28
+ return retstr;
29
+ }
30
+
31
+ static size_t wrfu(void *ptr, size_t size, size_t nmemb, void *stream) {
32
+ (void)stream;
33
+ (void)ptr;
34
+ return size * nmemb;
35
+ }
36
+
37
+ VALUE SSLStat = Qnil;
38
+ void Init_ssl_stat();
39
+ VALUE method_check(VALUE, VALUE);
40
+
41
+ void Init_ssl_stat(){
42
+ VALUE SSLStat = rb_define_module("SSLStat");
43
+ rb_define_method(SSLStat, "check", method_check, 1);
44
+ }
45
+
46
+ VALUE method_check(VALUE self, VALUE arg_url) {
47
+ char *url_to_check = StringValueCStr(arg_url);
48
+
49
+ CURL *curl;
50
+ CURLcode res;
51
+
52
+ curl_global_init(CURL_GLOBAL_DEFAULT);
53
+
54
+ curl = curl_easy_init();
55
+ if(curl) {
56
+ curl_easy_setopt(curl, CURLOPT_URL, url_to_check);
57
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, wrfu);
58
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
59
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
60
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
61
+ curl_easy_setopt(curl, CURLOPT_CERTINFO, 1L);
62
+
63
+ res = curl_easy_perform(curl);
64
+
65
+ if(!res) {
66
+ struct curl_certinfo *certinfo;
67
+ int need_break = 0;
68
+ char *serial_number, *expire_date, *start_date;
69
+
70
+ res = curl_easy_getinfo(curl, CURLINFO_CERTINFO, &certinfo);
71
+
72
+ if(!res && certinfo) {
73
+ int i;
74
+
75
+ for(i = 0; i < certinfo->num_of_certs; i++) {
76
+ struct curl_slist *slist;
77
+
78
+ for(slist = certinfo->certinfo[i]; slist; slist = slist->next) {
79
+ if (strstr(slist->data, "Serial Number:") != NULL) {
80
+ serial_number = get_second_part(slist->data);
81
+ }
82
+
83
+ if(strstr(slist->data, "Start date:") != NULL) {
84
+ start_date = get_datetime(slist->data);
85
+ }
86
+
87
+ if(strstr(slist->data, "Expire date:") != NULL) {
88
+ expire_date = get_datetime(slist->data);
89
+ }
90
+ if(strstr(slist->data, "Subject Alternative Name") != NULL) {
91
+ need_break = 1;
92
+ }
93
+ }
94
+
95
+ if (need_break) {
96
+ VALUE hash = rb_hash_new();
97
+
98
+ rb_hash_aset(hash, rb_str_new2("serial_number"), rb_str_new_cstr(serial_number));
99
+ rb_hash_aset(hash, rb_str_new2("start_date"), rb_str_new_cstr(start_date));
100
+ rb_hash_aset(hash, rb_str_new2("expire_date"), rb_str_new_cstr(expire_date));
101
+
102
+ curl_easy_cleanup(curl);
103
+ curl_global_cleanup();
104
+ return hash;
105
+ }
106
+
107
+ }
108
+ }
109
+
110
+ }
111
+
112
+ curl_easy_cleanup(curl);
113
+ }
114
+
115
+ curl_global_cleanup();
116
+
117
+ return rb_hash_new();
118
+ }
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ssl_stat
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ferdinand E. Silva
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-06-03 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Ruby C Language Extension To Get SSL Certificate Information From URL
14
+ email: ferdinandsilva@ferdinandsilva.com
15
+ executables: []
16
+ extensions:
17
+ - ext/ssl_stat/extconf.rb
18
+ extra_rdoc_files: []
19
+ files:
20
+ - ext/ssl_stat/extconf.rb
21
+ - ext/ssl_stat/ssl_stat.c
22
+ homepage: http://ferdinandsilva.com
23
+ licenses: []
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubygems_version: 3.1.2
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: Ruby C Language Extension To Get SSL Certificate Information From URL
44
+ test_files: []