Skip to content

Commit 84d4e96

Browse files
save file
1 parent b148b1d commit 84d4e96

File tree

1 file changed

+246
-0
lines changed

1 file changed

+246
-0
lines changed
Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,246 @@
1+
2+
3+
4+
<html>
5+
6+
<head>
7+
8+
<title>generate certificate chain</title>
9+
10+
<base href='https://javascript-2020.github.io/utils/x509/generate-certificate-chain/'>
11+
12+
<link rel='shortcut icon' type='image/x-icon' href='images/favicon.ico'>
13+
14+
<script init>
15+
16+
</script>
17+
18+
19+
<style>
20+
21+
html
22+
{height:100%}
23+
body
24+
{height:calc(100% - 42px);margin:20px;display:flex;flex-direction:column}
25+
.hdr
26+
{font-family:arial;position:relative;margin-top:0;margin-bottom:20px;background:white;
27+
padding-bottom:10px;border-bottom:3px solid lightblue}
28+
.hdr-icon
29+
{display:inline-block;text-align:center;background:whitesmoke;border-radius:5px;
30+
border:1px solid lightgray;padding:5px 3px 0px;cursor:pointer;margin-right:10px;
31+
min-width:50px}
32+
.hdr-icon-img
33+
{width:25px;height:25px}
34+
.hdr-icon-label
35+
{margin:2px 0 0}
36+
.hdr-title
37+
{position:absolute;left:0;right:0;z-index:0;margin:0 auto}
38+
.hdr-date
39+
{float:right}
40+
41+
input
42+
{padding:5px 10px;font-size:16px}
43+
#chain
44+
{}
45+
pre
46+
{flex:1;border:1px solid lightgray;padding:10px}
47+
48+
</style>
49+
50+
</head>
51+
52+
<body>
53+
54+
55+
<div class=hdr>
56+
<a class=hdr-icon href='https://javascript-2020.github.io/'>
57+
<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==' />
58+
<div class=icon-label>
59+
home
60+
</div>
61+
</a>
62+
<a id=github class=hdr-icon href='https://github.com/javascript-2020/javascript-2020.github.io/tree/main/utils/x509/generate-certificate-chain/generate-certificate-chain.html'>
63+
<img class=hdr-icon-img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAbFJREFUOE/l1E2IT2EUx/HPIFI2lJfGwmYsxFZKEUWjKWM3pZSpKcqeBcpLZsNeUeNlZWdBSVFmkAXbmRWbWRCRjYW8jv+pc/V4utff3q3bvfc5z/k+557zO2dA97UHy7ERx3LbZbzEZzxscx3o4L3GWizusP/AO6yv7TXwAo5g9V8iL03vcRWnm8USeBHH/xFUb7uEE7HYAOMZeVmGm7iN61jVccBHjOMQxvAl870QoIDMZ87CfxR3E7QDTyroTjzOtf24k++R0w0BHMY9LEpDCeyXgRL4EyMBjEKcSs+o3r4uSbTQQ1r3CzVMBnCh2PimTQp9wgyJDZZV/g+Bz7E1c/AdezHdr7xp34UHvcIuye8XUZSy9A1nDT5UBSvPCL9oz9BeeY2GYR3msBIHsi834WlPTt9yrXQKIUdEIfoVhSG6Z3PTejdwGG+xDc9SPud7UZ6popjEyZaURMuOl8NhKvtzpKf4yGvMwk95l/5xwNkKeA0T5XCI96EcRbsLh5mWAtXARznyXtXA5tD4/YNYmuBzVTQN8Ctu5V/93tI1sbdjS463KxXwaFZ/NnP9h/kXPcNYElddRc0AAAAASUVORK5CYII='>
64+
<div class=hdr-icon-label>
65+
github
66+
</div>
67+
</a>
68+
<img class=hdr-title src='images/generate-certificate-chain.png' style='height:60px;top:-15px'>
69+
<div class=hdr-date>
70+
24 Apr 2025
71+
</div>
72+
</div hdr>
73+
74+
<div id=btns>
75+
<input id=clear value=clear type=button>
76+
<input id=add value=add type=button>
77+
<input id=save value=save type=button>
78+
</div>
79+
80+
<div id=chain>
81+
</div>
82+
83+
<pre id=view>
84+
</pre>
85+
86+
</body>
87+
88+
89+
<script>
90+
console.clear();
91+
console.log('generate-certificate-chain');
92+
console.log();
93+
console.json=v=>console.log(JSON.stringify(v,null,4));
94+
var ext;
95+
var $,datatype,menumod,keydown;
96+
97+
var mod = {};
98+
99+
var chain;
100+
var view
101+
var list = [];
102+
103+
104+
105+
var btn = {};
106+
107+
108+
//
109+
110+
111+
window.onload = init;
112+
113+
async function init(){
114+
115+
await load();
116+
initdom();
117+
118+
}//init
119+
120+
121+
async function load(){
122+
123+
var res = await fetch('https://raw.githubusercontent.com/javascript-2020/ext-code/main/ext-loader.js')
124+
var txt = await res.text();
125+
ext = eval(txt);
126+
[$,datatype,menumod,keydown] = await ext.load.libs(
127+
'js/dom/$.js',
128+
'js/core/datatype.js',
129+
'js/dom/menumod/menumod.js',
130+
'js/dom/keydown/keydown.js'
131+
);
132+
133+
}//load
134+
135+
136+
load.nodeforge = async function(){
137+
138+
var txt = localStorage['node-forge'];
139+
if(!txt){
140+
var url = 'https://cdn.jsdelivr.net/npm/node-forge/+esm';
141+
//console.log(url);
142+
var res = await fetch(url);
143+
txt = await res.text();
144+
localStorage['node-forge'] = txt;
145+
}
146+
var blob = new Blob([txt],{type:'text/javascript'});
147+
var url = window.URL.createObjectURL(blob);
148+
var nodeforge = await import(url);
149+
pki = nodeforge.default.pki;
150+
151+
}//nodeforge
152+
153+
154+
function initdom(){
155+
156+
157+
var btns = $('#btns');
158+
159+
$(btns,'#clear').onclick = btn.clear;
160+
$(btns,'#add').onclick = btn.add;
161+
$(btns,'#save').onclick = btn.save;
162+
163+
164+
chain = $('#chain');
165+
166+
167+
view = $('#view')
168+
view.replaceChildren();
169+
170+
171+
}//initdom
172+
173+
174+
btn.clear = function(){
175+
176+
list = [];
177+
view.textContent = list.join('\n');
178+
179+
}//clear
180+
181+
182+
btn.add = async function(){
183+
184+
var txt = await load.file();
185+
list.push(txt);
186+
187+
view.textContent = list.join('\n');
188+
189+
}//add
190+
191+
192+
btn.save = function(){
193+
194+
var cert = list.join('\n');
195+
var blob = new Blob([cert]);
196+
var url = window.URL.createObjectURL(blob);
197+
var a = document.createElement('a');
198+
a.download = 'cert.chain.pem';
199+
a.href = url;
200+
a.click();
201+
202+
}//save
203+
204+
205+
206+
load.file = function(){
207+
208+
var resolve,promise=new Promise(res=>resolve=res);
209+
210+
var input = document.createElement('input');
211+
input.type = 'file';
212+
input.onchange = onchange;
213+
input.click();
214+
215+
return promise;
216+
217+
218+
async function onchange(){
219+
220+
var txt = await input.files[0].text();
221+
resolve(txt);
222+
223+
}//onchange
224+
225+
}//load.file
226+
227+
228+
function display(){
229+
}//display
230+
231+
232+
233+
234+
235+
236+
237+
238+
</script>
239+
240+
241+
</html>
242+
243+
244+
245+
246+

0 commit comments

Comments
 (0)