|
1 | 1 |
|
2 | 2 |
|
| 3 | + |
| 4 | +<!DOCTYPE html> |
| 5 | + |
3 | 6 | <html> |
4 | 7 |
|
5 | 8 | <head> |
| 9 | + <meta charset=utf-8> |
6 | 10 |
|
7 | | - <title>extract public key</title> |
| 11 | + <title> |
| 12 | + Extract Public Key |
| 13 | + </title> |
| 14 | + |
| 15 | + <meta name=description content='extract public key from x509 certificate'> |
8 | 16 |
|
9 | 17 | <base href='https://ext-code.com/utils/x509/extract-public-key/'> |
10 | | - <base href='https://javascript-2020.github.io/utils/x509/extract-public-key/'> |
| 18 | + <link rel=canonical href='https://ext-code.com/utils/x509/extract-public-key/extract-public-key.html'> |
11 | 19 |
|
12 | | - <link rel='shortcut icon' type='image/x-icon' href='images/favicon.ico'> |
| 20 | + <link rel=icon type='image/x-icon' href='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAAAz1BMVEVHcExFjOkWsvNGjug9jOxBhesulvAMtfsqofAvoO4pn+8hqPA0j+4WtvQhoPQfuvENuPkYrPchsfMYrPcepfVFiOgqnPE5jO1CguofrfEbrPULufoLu/kIu/sUtfMRsfljr/Q+h+0tl/JmufcJuPwVrfiTz/kZqvcknPNRoPKky/um0vobp/YcpfZmo/NltfY1nvKUxvl7vvdJtPYtqPVDvfms1/o3q/VEku9Ki+09mfFZlfCb1/mfxPu54PmEx/q64/lsw/dTqvOUvflcsvflva1XAAAAH3RSTlMAKFwUi9XO/jUfW1zpJf4KqOcY1+1BrNHsPaPJhNJObHCDBwAAAM1JREFUKM/lkUcSgkAURAEJIyoK5sjA4ICggBJMiPH+Z5IRq3SBxQHs7avf1d2fov5aFZqu/IQ026/XebZaTLuctlssDjoPCm85zV3bsQN1vuie1fwguME49fSeKAIFAGrINJqzRp6K22/O5zVEaeJbltRpd+SRrLZbwvjF6cHxhCIHh9fLxvO87WppzueqKhhGq/nGjxDHUYYRQl94quTmdxtCjBNMzKUMmwQLxuQdzbVteAuikEQTa0QMUfVTzHHwj2Ils5SNWvaSP9QTHZEaQktZsJwAAAAASUVORK5CYII='> |
| 21 | + <meta name=viewport content='width=device-width, initial-scale=1'> |
| 22 | + |
| 23 | + <script type='application/ld+json'> |
| 24 | + { |
| 25 | + "@context" : "https://schema.org", |
| 26 | + "@type" : "SoftwareApplication", |
| 27 | + "name" : "Extract Public Key From X509 Certificate", |
| 28 | + "url" : "https://ext-code.com/utils/x509/certificate-info/certificate-info.html", |
| 29 | + "author" : {"@type":"Person","name":"Matthew Richards"}, |
| 30 | + "description" : "Extract public key from x509 certificate", |
| 31 | + "applicationCategory" : "DeveloperApplication", |
| 32 | + "operatingSystem" : "All", |
| 33 | + "browserRequirements" : "Requires JavaScript-enabled browser", |
| 34 | + "softwareVersion" : "1.0.0", |
| 35 | + "offers" : {"@type":"Offer","price":"0","priceCurrency":"GBP"} |
| 36 | + } |
| 37 | + </script> |
13 | 38 |
|
14 | 39 |
|
| 40 | + <script src='https://libs.ext-code.com/js/dom/component/component.js'></script> |
| 41 | + |
15 | 42 | <script init> |
16 | | - |
17 | | - </script> |
| 43 | + console.clear(); |
| 44 | + console.log('extract-public-key-v2.0.html'); |
| 45 | + console.log(); |
| 46 | + console.json=v=>console.log(JSON.stringify(v,null,4)); |
| 47 | + var df=true,did='html' |
| 48 | + ; |
| 49 | + |
| 50 | + var ext; |
| 51 | + var $; |
| 52 | + var datatype; |
| 53 | + var menumod; |
| 54 | + var keydown; |
| 55 | + |
| 56 | + var hdr; |
| 57 | + var filemod; |
| 58 | + var log; |
| 59 | + |
| 60 | + |
| 61 | + |
| 62 | + |
| 63 | + //: |
| 64 | + |
| 65 | + |
| 66 | + async function init(){ |
| 67 | + |
| 68 | + |
| 69 | + await load(); |
| 70 | + |
| 71 | + |
| 72 | + menu = menumod(); |
| 73 | + |
| 74 | + hdr = mod['x509-hdr']; |
| 75 | + //filemod = mod['file-mod']; |
| 76 | + log = mod['log-mod']; |
| 77 | + |
| 78 | + |
| 79 | + hdr.initmod({ext,$,menu}); |
| 80 | + //filemod.initmod({ext,$,menu,menumod,complete,focus,source,editor,log}); |
| 81 | + log.initmod({ext,$}); |
| 82 | + |
| 83 | + await Promise.all([ |
| 84 | + hdr.init(), |
| 85 | + //filemod.init(), |
| 86 | + log.init(), |
| 87 | + ]); |
| 88 | + |
| 89 | + |
| 90 | + |
| 91 | + initdom(document.body); |
| 92 | + |
| 93 | + |
| 94 | + }//init |
| 95 | + |
| 96 | + |
| 97 | +(async()=>{ |
| 98 | + |
| 99 | + mod.stack.add; |
| 100 | + |
| 101 | + ({ext} = await import('https://libs.ext-code.com/js/io/ext-loader/ext-loader.m.js')); |
| 102 | + |
| 103 | + var promise = ext.load.libs( |
| 104 | + 'js/dom/$.js', |
| 105 | + 'js/core/datatype.js', |
| 106 | + 'js/dom/menumod/menumod.js', |
| 107 | + 'js/dom/keydown/keydown.js', |
| 108 | + ); |
| 109 | + [$,datatype,menumod,keydown] = await promise; |
| 110 | + |
| 111 | + mod.stack.complete; |
| 112 | + |
| 113 | +})(); |
| 114 | + |
| 115 | + |
| 116 | + |
| 117 | + |
| 118 | + async function load(){ |
| 119 | + |
| 120 | + //var nodeForge = await import('https://cdn.jsdelivr.net/npm/node-forge/+esm'); |
| 121 | + var txt = localStorage['node-forge']; |
| 122 | + |
| 123 | + if(!txt){ |
| 124 | + var url = 'https://cdn.jsdelivr.net/npm/node-forge/+esm'; |
| 125 | + console.log(url); |
| 126 | + var res = await fetch(url); |
| 127 | + txt = await res.text(); |
| 128 | + localStorage['node-forge'] = txt; |
| 129 | + } |
| 130 | + |
| 131 | + var blob = new Blob([txt],{type:'text/javascript'}); |
| 132 | + var url = window.URL.createObjectURL(blob); |
| 133 | + var nodeforge = await import(url); |
| 134 | + pki = nodeforge.default.pki; |
| 135 | + console.log(pki); |
| 136 | + }//load |
| 137 | + |
| 138 | + |
| 139 | + </script init> |
18 | 140 |
|
19 | 141 |
|
20 | 142 | <style> |
|
56 | 178 | {flex:1} |
57 | 179 | pre |
58 | 180 | {border:1px solid lightgray;font-size:16px;font-family:monospace} |
| 181 | + |
| 182 | + |
| 183 | + .visually-hidden |
| 184 | + {position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important; |
| 185 | + clip:rect(0 0 0 0) !important;white-space:nowrap !important;border:0 !important} |
| 186 | + |
59 | 187 |
|
60 | 188 | </style> |
61 | 189 |
|
|
64 | 192 |
|
65 | 193 | <body> |
66 | 194 |
|
| 195 | + <x509-hdr component=grp> |
| 196 | + <h1 class=visually-hidden> |
| 197 | + extract public key |
| 198 | + </h1> |
| 199 | + <img class=title src='images/extract-public-key.png' style='top:-5px;height:55px'> |
| 200 | + <time slot=date datetime=2025-11-15> |
| 201 | + 15 Nov 2025 |
| 202 | + </time> |
| 203 | + </x509-hdr> |
| 204 | + |
| 205 | + |
| 206 | +<!-- |
67 | 207 | <div class=hdr> |
68 | 208 | <a class=hdr-icon href='https://javascript-2020.github.io/'> |
69 | 209 | <img class=hdr-icon-img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAAAqFBMVEVHcEwjmpckopg9f3YxpJM6r5kjq58Nmp0Nn6QRoKExrpshnpgtoJUdoZwYnZ02spwYpaEmrZ8djpINn6Qtrp4inpcjqZ8SoqM3s5w0sp01spwrr58vr50oqpwdnpo0sZwtrJwUpKMMoaUtq50op5ssqpopppseqaM1sJwgpJ0NoaUSoaI3kYobqaMSpKQrr58PoaMVpaIOoKMLpKcXpaEkqp8Rm58YrKUL0CR4AAAAOHRSTlMACBkBCyinK59CQhUOLyKjqbUGpZgSYn6rp5WsekcmgkyWmCkmNB7AYTiuVgKuuo91i2PLn2lJ7kISMf4AAAElSURBVCjPrdPXloIwEAbgBDFKCRo6SO8lYEHd93+zxV7Zm2WuSL6Tk/MPEwBGLFH8SzFCeFiDXNeJ+7GtGds1D+ghDzzPzXX6xlJbq75s5KVLiJsSB76xIhd22Mz0pkyRnqzW2htD/SeUjL0EQKY60nqRvTLXGl64PR/SfDVxVvETZ123w8vN9Ur5YKUF4R9cd/WxqiePgCs3IMF1QXcVt6vK59tSqyjN4hwQbhS8mUuvWTLbwYtTQGhEjLHVPprv+4ztQ8AeRVn50uipBcXg/IPgfPaFF+z1axyeMEkcJwwdYHHZINQ02gALS49lJcQMci/COGzdue8apRQwNz4tYvM207JSRVEUhvtW6KeBIFVVbds07xPncZfCfWSK+UtNJ/9+VL/nTBuX7xjDZwAAAABJRU5ErkJggg==' /> |
|
84 | 224 | 22 Apr 2025 |
85 | 225 | </div> |
86 | 226 | </div hdr> |
87 | | - |
| 227 | +--> |
88 | 228 |
|
89 | 229 | <div id=view> |
90 | 230 |
|
|
124 | 264 |
|
125 | 265 |
|
126 | 266 | <script> |
127 | | - console.clear(); |
128 | | - console.log('extract-public-key'); |
129 | | - console.log(); |
130 | | - console.json=v=>console.log(JSON.stringify(v,null,4)); |
131 | | - |
132 | | - var $ = (root,sel)=>(!sel && (sel=root,root=document),root.querySelector(sel)); |
133 | | - $.mousetext = function(e,text){ |
134 | | - |
135 | | - var left = e.pageX+'px'; |
136 | | - var top = e.pageY+'px'; |
137 | | - var style = {position:'absolute',left,top,padding:'10px',border:'1px solid dimgray',borderRadius:'3px',zIndex:999999,background:'white'}; |
138 | | - var append = document.body; |
139 | | - var div = $.create.div({style,text,append}); |
140 | | - var rem = ()=>div.remove(); |
141 | | - div.onmouseleave = rem; |
142 | | - div.onclick = rem; |
143 | | - var time = 700; |
144 | | - setTimeout(rem,time); |
145 | | - |
146 | | - }//mousetext |
147 | 267 |
|
148 | 268 |
|
149 | 269 | var pki; |
|
157 | 277 | btn.key = {}; |
158 | 278 |
|
159 | 279 |
|
160 | | - setTimeout(init,50); |
161 | | - |
162 | | - async function init(){ |
163 | | - |
164 | | - await load(); |
165 | | - |
166 | | - initdom(); |
167 | | - |
168 | | - }//init |
169 | | - |
170 | | - //: |
171 | | - |
172 | | - async function load(){ |
173 | | - |
174 | | - //var nodeForge = await import('https://cdn.jsdelivr.net/npm/node-forge/+esm'); |
175 | | - var txt = localStorage['node-forge']; |
176 | | - |
177 | | - if(!txt){ |
178 | | - var url = 'https://cdn.jsdelivr.net/npm/node-forge/+esm'; |
179 | | - console.log(url); |
180 | | - var res = await fetch(url); |
181 | | - txt = await res.text(); |
182 | | - localStorage['node-forge'] = txt; |
183 | | - } |
184 | | - |
185 | | - var blob = new Blob([txt],{type:'text/javascript'}); |
186 | | - var url = window.URL.createObjectURL(blob); |
187 | | - var nodeforge = await import(url); |
188 | | - pki = nodeforge.default.pki; |
189 | | - console.log(pki); |
190 | | - }//load |
191 | | - |
192 | 280 | //: |
193 | 281 |
|
194 | 282 | function initdom(){ |
195 | 283 |
|
196 | 284 | var rootnode = document.body; |
197 | 285 |
|
198 | | - var root = {}; |
199 | 286 |
|
| 287 | + hdr.initdom(rootnode); |
| 288 | + |
| 289 | + |
| 290 | + var root = {}; |
200 | 291 |
|
201 | 292 | root.cert = $(rootnode,'#cert-root'); |
202 | 293 |
|
|
214 | 305 |
|
215 | 306 | key = $(root.key,'#key'); |
216 | 307 |
|
| 308 | + |
| 309 | + |
| 310 | + log.initdom(); |
217 | 311 |
|
218 | 312 | }//initdom |
219 | 313 |
|
|
0 commit comments