Self-signed-certificate PKEY+CSR+X509 (SSL)


/ Published in: PHP
Save to your folder(s)

Web-form for generating Private key, Certificate Signing Request and Self-signed-certificate


Copy this code and paste it in your HTML
  1. <?php
  2.  
  3. // ISO_3166-2
  4. $countries = array(
  5. array('AD', 'Andorra', 'Андорра'),
  6. array('AE', 'United Arab Emirates', 'Объединённые Арабские Эмираты'),
  7. array('AF', 'Afghanistan', 'Афганистан'),
  8. array('AG', 'Antigua and Barbuda', 'Антигуа и Барбуда'),
  9. array('AI', 'Anguilla', 'Ангилья'),
  10. array('AL', 'Albania', 'Албания'),
  11. array('AM', 'Armenia', 'Армения'),
  12. array('AN', 'Netherlands Antilles', 'Нидерландские Антилы'),
  13. array('AO', 'Angola', 'Ангола'),
  14. array('AQ', 'Antarctica', 'Антарктида'),
  15. array('AR', 'Argentina', 'Аргентина'),
  16. array('AS', 'American Samoa', 'Американское Самоа'),
  17. array('AT', 'Austria', 'Австрия'),
  18. array('AU', 'Australia', 'Австралия'),
  19. array('AW', 'Aruba', 'Аруба'),
  20. array('AX', 'Aland Islands', 'Эландские острова'),
  21. array('AZ', 'Azerbaijan', 'Азербайджан'),
  22. array('BA', 'Bosnia and Herzegovina', 'Босния и Герцеговина'),
  23. array('BB', 'Barbados', 'Барбадос'),
  24. array('BD', 'Bangladesh', 'Бангладеш'),
  25. array('BE', 'Belgium', 'Бельгия'),
  26. array('BF', 'Burkina Faso', 'Буркина Фасо'),
  27. array('BG', 'Bulgaria', 'Болгария'),
  28. array('BH', 'Bahrain', 'Бахрейн'),
  29. array('BI', 'Burundi', 'Бурунди'),
  30. array('BJ', 'Benin', 'Бенин'),
  31. array('BL', 'Saint Barthelemy', 'Сен-Бартельми'),
  32. array('BM', 'Bermuda', 'Бермуды'),
  33. array('BN', 'Brunei', 'Бруней'),
  34. array('BO', 'Bolivia', 'Боливия'),
  35. array('BR', 'Brazil', 'Бразилия'),
  36. array('BS', 'Bahamas', 'Багамы'),
  37. array('BT', 'Bhutan', 'Бутан'),
  38. array('BV', 'Bouvet Island', 'Остров Буве'),
  39. array('BW', 'Botswana', 'Ботсвана'),
  40. array('BY', 'Belarus', 'Беларусь'),
  41. array('BZ', 'Belize', 'Белиз'),
  42. array('CA', 'Canada', 'Канада'),
  43. array('CC', 'Cocos (Keeling) Islands', 'Кокосовые (Килинг) острова'),
  44. array('CD', 'Congo (Democratic Republic)', 'Конго (Демократическая Республика)'),
  45. array('CF', 'Central African Republic', 'Центральноафриканская Республика'),
  46. array('CG', 'Congo', 'Конго'),
  47. array('CH', 'Switzerland', 'Швейцария'),
  48. array('CI', 'Cote d’Ivoire', 'Кот-д’Ивуар'),
  49. array('CK', 'Cook Islands', 'Острова Кука'),
  50. array('CL', 'Chile', 'Чили'),
  51. array('CM', 'Cameroon', 'Камерун'),
  52. array('CN', 'China', 'Китай'),
  53. array('CO', 'Colombia', 'Колумбия'),
  54. array('CR', 'Costa Rica', 'Коста-Рика'),
  55. array('CU', 'Cuba', 'Куба'),
  56. array('CV', 'Cape Verde', 'Кабо-Верде'),
  57. array('CX', 'Christmas Island', 'Остров Рождества'),
  58. array('CY', 'Cyprus', 'Кипр'),
  59. array('CZ', 'Czech Republic', 'Чехия'),
  60. array('DE', 'Germany', 'Германия'),
  61. array('DJ', 'Djibouti', 'Джибути'),
  62. array('DK', 'Denmark', 'Дания'),
  63. array('DM', 'Dominica', 'Доминика'),
  64. array('DO', 'Dominican Republic', 'Доминиканская Республика'),
  65. array('DZ', 'Algeria', 'Алжир'),
  66. array('EC', 'Ecuador', 'Эквадор'),
  67. array('EE', 'Estonia', 'Эстония'),
  68. array('EG', 'Egypt', 'Египет'),
  69. array('EH', 'Western Sahara', 'Западная Сахара'),
  70. array('ER', 'Eritrea', 'Эритрея'),
  71. array('ES', 'Spain', 'Испания'),
  72. array('ET', 'Ethiopia', 'Эфиопия'),
  73. array('EU', 'European Union', 'Евросоюз'),
  74. array('FI', 'Finland', 'Финляндия'),
  75. array('FJ', 'Fiji', 'Фиджи'),
  76. array('FK', 'Falkland Islands (Malvinas)', 'Фолклендские острова (Мальвинские)'),
  77. array('FM', 'Micronesia', 'Микронезия'),
  78. array('FO', 'Faroe Islands', 'Фарерские острова'),
  79. array('FR', 'France', 'Франция'),
  80. array('GA', 'Gabon', 'Габон'),
  81. array('GB', 'United Kingdom', 'Великобритания'),
  82. array('GD', 'Grenada', 'Гренада'),
  83. array('GE', 'Georgia', 'Грузия'),
  84. array('GF', 'French Guiana', 'Французская Гвиана'),
  85. array('GG', 'Guernsey', 'Гернси'),
  86. array('GH', 'Ghana', 'Гана'),
  87. array('GI', 'Gibraltar', 'Гибралтар'),
  88. array('GL', 'Greenland', 'Гренландия'),
  89. array('GM', 'Gambia', 'Гамбия'),
  90. array('GN', 'Guinea', 'Гвинея'),
  91. array('GP', 'Guadeloupe', 'Гваделупа'),
  92. array('GQ', 'Equatorial Guinea', 'Экваториальная Гвинея'),
  93. array('GR', 'Greece', 'Греция'),
  94. array('GS', 'South Georgia and the South Sandwich Islands', 'Южная Джорджия и Южные Сандвичевы острова'),
  95. array('GT', 'Guatemala', 'Гватемала'),
  96. array('GU', 'Guam', 'Гуам'),
  97. array('GW', 'Guinea-Bissau', 'Гвинея-Бисау'),
  98. array('GY', 'Guyana', 'Гайана'),
  99. array('HK', 'Hong Kong', 'Гонконг'),
  100. array('HM', 'Heard Island and McDonald Islands', 'Остров Херд и острова Макдональд'),
  101. array('HN', 'Honduras', 'Гондурас'),
  102. array('HR', 'Croatia', 'Хорватия'),
  103. array('HT', 'Haiti', 'Гаити'),
  104. array('HU', 'Hungary', 'Венгрия'),
  105. array('ID', 'Indonesia', 'Индонезия'),
  106. array('IE', 'Ireland', 'Ирландия'),
  107. array('IL', 'Israel', 'Израиль'),
  108. array('IM', 'Isle of Man', 'Остров Мэн'),
  109. array('IN', 'India', 'Индия'),
  110. array('IO', 'British Indian Ocean Territory', 'Британская территория в Индийском океане'),
  111. array('IQ', 'Iraq', 'Ирак'),
  112. array('IR', 'Iran', 'Иран'),
  113. array('IS', 'Iceland', 'Исландия'),
  114. array('IT', 'Italy', 'Италия'),
  115. array('JE', 'Jersey', 'Джерси'),
  116. array('JM', 'Jamaica', 'Ямайка'),
  117. array('JO', 'Jordan', 'Иордания'),
  118. array('JP', 'Japan', 'Япония'),
  119. array('KE', 'Kenya', 'Кения'),
  120. array('KG', 'Kyrgyzstan', 'Киргизия'),
  121. array('KH', 'Cambodia', 'Камбоджа'),
  122. array('KI', 'Kiribati', 'Кирибати'),
  123. array('KM', 'Comoros', 'Коморы'),
  124. array('KN', 'Saint Kitts and Nevis', 'Сент-Китс и Невис'),
  125. array('KP', 'North Korea', 'Северная Корея'),
  126. array('KR', 'South Korea', 'Южная Корея'),
  127. array('KW', 'Kuwait', 'Кувейт'),
  128. array('KY', 'Cayman Islands', 'Острова Кайман'),
  129. array('KZ', 'Kazakhstan', 'Казахстан'),
  130. array('LA', 'Laos', 'Лаос'),
  131. array('LB', 'Lebanon', 'Ливан'),
  132. array('LC', 'Saint Lucia', 'Сент-Люсия'),
  133. array('LI', 'Liechtenstein', 'Лихтенштейн'),
  134. array('LK', 'Sri Lanka', 'Шри-Ланка'),
  135. array('LR', 'Liberia', 'Либерия'),
  136. array('LS', 'Lesotho', 'Лесото'),
  137. array('LT', 'Lithuania', 'Литва'),
  138. array('LU', 'Luxembourg', 'Люксембург'),
  139. array('LV', 'Latvia', 'Латвия'),
  140. array('LY', 'Libya', 'Ливия'),
  141. array('MA', 'Morocco', 'Марокко'),
  142. array('MC', 'Monaco', 'Монако'),
  143. array('MD', 'Moldova', 'Молдова'),
  144. array('ME', 'Montenegro', 'Черногория'),
  145. array('MF', 'Saint Martin', 'Остров Святого Мартина'),
  146. array('MG', 'Madagascar', 'Мадагаскар'),
  147. array('MH', 'Marshall Islands', 'Маршалловы острова'),
  148. array('MK', 'Macedonia', 'Македония'),
  149. array('ML', 'Mali', 'Мали'),
  150. array('MM', 'Myanmar', 'Мьянма'),
  151. array('MN', 'Mongolia', 'Монголия'),
  152. array('MO', 'Macao', 'Макао'),
  153. array('MP', 'Northern Mariana Islands', 'Северные Марианские острова'),
  154. array('MQ', 'Martinique', 'Мартиника'),
  155. array('MR', 'Mauritania', 'Мавритания'),
  156. array('MS', 'Montserrat', 'Монтсеррат'),
  157. array('MT', 'Malta', 'Мальта'),
  158. array('MU', 'Mauritius', 'Маврикий'),
  159. array('MV', 'Maldives', 'Мальдивы'),
  160. array('MW', 'Malawi', 'Малави'),
  161. array('MX', 'Mexico', 'Мексика'),
  162. array('MY', 'Malaysia', 'Малайзия'),
  163. array('MZ', 'Mozambique', 'Мозамбик'),
  164. array('NA', 'Namibia', 'Намибия'),
  165. array('NC', 'New Caledonia', 'Новая Каледония'),
  166. array('NE', 'Niger', 'Нигер'),
  167. array('NF', 'Norfolk Island', 'Остров Норфолк'),
  168. array('NG', 'Nigeria', 'Нигерия'),
  169. array('NI', 'Nicaragua', 'Никарагуа'),
  170. array('NL', 'Netherlands', 'Нидерланды'),
  171. array('NO', 'Norway', 'Норвегия'),
  172. array('NP', 'Nepal', 'Непал'),
  173. array('NR', 'Nauru', 'Науру'),
  174. array('NU', 'Niue', 'Ниуэ'),
  175. array('NZ', 'New Zealand', 'Новая Зеландия'),
  176. array('OM', 'Oman', 'Оман'),
  177. array('PA', 'Panama', 'Панама'),
  178. array('PE', 'Peru', 'Перу'),
  179. array('PF', 'French Polynesia', 'Французская Полинезия'),
  180. array('PG', 'Papua New Guinea', 'Папуа-Новая Гвинея'),
  181. array('PH', 'Philippines', 'Филиппины'),
  182. array('PK', 'Pakistan', 'Пакистан'),
  183. array('PL', 'Poland', 'Польша'),
  184. array('PM', 'Saint Pierre and Miquelon', 'Сен-Пьер и Микелон'),
  185. array('PN', 'Pitcairn', 'Питкерн'),
  186. array('PR', 'Puerto Rico', 'Пуэрто-Рико'),
  187. array('PS', 'Palestinian Territory', 'Палестинская автономия'),
  188. array('PT', 'Portugal', 'Португалия'),
  189. array('PW', 'Palau', 'Палау'),
  190. array('PY', 'Paraguay', 'Парагвай'),
  191. array('QA', 'Qatar', 'Катар'),
  192. array('RE', 'Reunion', 'Реюньон'),
  193. array('RO', 'Romania', 'Румыния'),
  194. array('RS', 'Serbia', 'Сербия'),
  195. array('RU', 'Russian Federation', 'Россия'),
  196. array('RW', 'Rwanda', 'Руанда'),
  197. array('SA', 'Saudi Arabia', 'Саудовская Аравия'),
  198. array('SB', 'Solomon Islands', 'Соломоновы острова'),
  199. array('SC', 'Seychelles', 'Сейшелы'),
  200. array('SD', 'Sudan', 'Судан'),
  201. array('SE', 'Sweden', 'Швеция'),
  202. array('SG', 'Singapore', 'Сингапур'),
  203. array('SH', 'Saint Helena', 'Святая Елена'),
  204. array('SI', 'Slovenia', 'Словения'),
  205. array('SJ', 'Svalbard and Jan Mayen', 'Шпицберген и Ян Майен'),
  206. array('SK', 'Slovakia', 'Словакия'),
  207. array('SL', 'Sierra Leone', 'Сьерра-Леоне'),
  208. array('SM', 'San Marino', 'Сан-Марино'),
  209. array('SN', 'Senegal', 'Сенегал'),
  210. array('SO', 'Somalia', 'Сомали'),
  211. array('SR', 'Suriname', 'Суринам'),
  212. array('SS', 'South Sudan', 'Южный Судан'),
  213. array('ST', 'Sao Tome and Principe', 'Сан-Томе и Принсипи'),
  214. array('SV', 'El Salvador', 'Эль-Сальвадор'),
  215. array('SY', 'Syrian Arab Republic', 'Сирийская Арабская Республика'),
  216. array('SZ', 'Swaziland', 'Свазиленд'),
  217. array('TC', 'Turks and Caicos Islands', 'Острова Теркс и Кайкос'),
  218. array('TD', 'Chad', 'Чад'),
  219. array('TF', 'French Southern Territories', 'Французские Южные территории'),
  220. array('TG', 'Togo', 'Того'),
  221. array('TH', 'Thailand', 'Таиланд'),
  222. array('TJ', 'Tajikistan', 'Таджикистан'),
  223. array('TK', 'Tokelau', 'Токелау'),
  224. array('TL', 'Timor-Leste', 'Тимор-Лесте'),
  225. array('TM', 'Turkmenistan', 'Туркмения'),
  226. array('TN', 'Tunisia', 'Тунис'),
  227. array('TO', 'Tonga', 'Тонга'),
  228. array('TR', 'Turkey', 'Турция'),
  229. array('TT', 'Trinidad and Tobago', 'Тринидад и Тобаго'),
  230. array('TV', 'Tuvalu', 'Тувалу'),
  231. array('TW', 'Taiwan', 'Тайвань'),
  232. array('TZ', 'Tanzania', 'Танзания'),
  233. array('UA', 'Ukraine', 'Украина'),
  234. array('UG', 'Uganda', 'Уганда'),
  235. array('UM', 'United States Minor Outlying Islands', 'Малые Тихоокеанские отдаленные острова Соединенных Штатов'),
  236. array('US', 'United States', 'Соединенные Штаты Америки'),
  237. array('UY', 'Uruguay', 'Уругвай'),
  238. array('UZ', 'Uzbekistan', 'Узбекистан'),
  239. array('VA', 'Holy See (Vatican)', 'Папский Престол (Ватикан)'),
  240. array('VC', 'Saint Vincent and the Grenadines', 'Сент-Винсент и Гренадины'),
  241. array('VE', 'Venezuela', 'Венесуэла'),
  242. array('VG', 'Virgin Islands (British)', 'Виргинские острова (Британские)'),
  243. array('VI', 'Virgin Islands (U.S.)', 'Виргинские острова (США)'),
  244. array('VN', 'Viet Nam', 'Вьетнам'),
  245. array('VU', 'Vanuatu', 'Вануату'),
  246. array('WF', 'Wallis and Futuna', 'Уоллис и Футуна'),
  247. array('WS', 'Samoa', 'Самоа'),
  248. array('YE', 'Yemen', 'Йемен'),
  249. array('YT', 'Mayotte', 'Майотта'),
  250. array('ZA', 'South Africa', 'Южная Африка'),
  251. array('ZM', 'Zambia', 'Замбия'),
  252. array('ZW', 'Zimbabwe', 'Зимбабве'),
  253. );
  254.  
  255. // ru/en
  256. $language = 'ru';
  257.  
  258. $countries_codes = array();
  259. foreach($countries as $country) {
  260. $countries_codes[] = $country[0];
  261. }
  262. $countries_names = array();
  263. foreach($countries as $country) {
  264. switch($language) {
  265. case 'ru':
  266. $countries_names[] = $country[2];
  267. break;
  268. case 'en':
  269. $countries_names[] = $country[1];
  270. break;
  271. }
  272. }
  273.  
  274. $fields = array(
  275. 'countryName' => array(
  276. 'en' => 'Country',
  277. 'ru' => 'Страна',
  278. ),
  279. 'stateOrProvinceName' => array(
  280. 'en' => 'State or Province',
  281. 'ru' => 'Область',
  282. ),
  283. 'localityName' => array(
  284. 'en' => 'Locality',
  285. 'ru' => 'Город',
  286. ),
  287. 'organizationName' => array(
  288. 'en' => 'Organization',
  289. 'ru' => 'Название организации',
  290. ),
  291. 'organizationalUnitName' => array(
  292. 'en' => 'Organizational Unit',
  293. 'ru' => 'Подразделение',
  294. ),
  295. 'commonName' => array(
  296. 'en' => 'Domain',
  297. 'ru' => 'Домен',
  298. ),
  299. );
  300.  
  301. if($_POST) {
  302. function validate_country_code($input) {
  303. global $countries_codes;
  304. if(!empty($input) && preg_match("/([A-Z]{2})/", $input) && in_array($input, $countries_codes)) {
  305. return TRUE;
  306. }
  307. else {
  308. return FALSE;
  309. }
  310. }
  311. function validate_latin($input) {
  312. if(!empty($input) && preg_match("/([A-z-\s]{1,256})/", $input)) {
  313. return TRUE;
  314. }
  315. else {
  316. return FALSE;
  317. }
  318. }
  319. function validate_domain($input) {
  320. // http://stackoverflow.com/a/4694816
  321. if(!empty($input) && preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $input) && preg_match("/^.{1,253}$/", $input) && preg_match("/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $input)) {
  322. return TRUE;
  323. }
  324. else {
  325. return FALSE;
  326. }
  327. }
  328.  
  329. $errors = array();
  330. if(!validate_country_code($_POST['countryName'])) {
  331. switch($language) {
  332. case 'ru':
  333. $errors[] = 'Неправильно заполнено поле: '.$fields['countryName'][$language];
  334. break;
  335. case 'en':
  336. $errors[] = 'Bad field: '.$fields['countryName'][$language];
  337. break;
  338. }
  339. }
  340. foreach(array(
  341. 'stateOrProvinceName' => $_POST['stateOrProvinceName'],
  342. 'localityName' => $_POST['localityName'],
  343. 'organizationName' => $_POST['organizationName'],
  344. 'organizationalUnitName' => $_POST['organizationalUnitName'],
  345. ) as $key => $value) {
  346. if(!validate_latin($value)) {
  347. switch($language) {
  348. case 'ru':
  349. $errors[] = 'Заполняется латиницей: '.$fields[$key][$language];
  350. break;
  351. case 'en':
  352. $errors[] = 'Latin only: '.$fields[$key][$language];
  353. break;
  354. }
  355. }
  356. }
  357. if(!validate_domain($_POST['commonName'])) {
  358. switch($language) {
  359. case 'ru':
  360. $errors[] = 'Неправильно заполнено поле: '.$fields['commonName'][$language];
  361. break;
  362. case 'en':
  363. $errors[] = 'Bad field: '.$fields['commonName'][$language];
  364. break;
  365. }
  366. }
  367. if(empty($errors)) {
  368. // http://php.net/manual/en/function.openssl-csr-new.php
  369. $dn = array(
  370. 'countryName' => $_POST['countryName'],
  371. 'stateOrProvinceName' => $_POST['stateOrProvinceName'],
  372. 'localityName' => $_POST['localityName'],
  373. 'organizationName' => $_POST['organizationName'],
  374. 'organizationalUnitName' => $_POST['organizationalUnitName'],
  375. 'commonName' => $_POST['commonName'],
  376. );
  377. $configargs = array(
  378. 'private_key_bits' => 2048,
  379. 'encrypt_key' => FALSE,
  380. 'private_key_type' => OPENSSL_KEYTYPE_RSA,
  381. );
  382. $privkey = openssl_pkey_new($configargs);
  383. openssl_pkey_export($privkey, $pkeyout, '', $configargs);
  384. $csr = openssl_csr_new($dn, $privkey, $configargs);
  385. openssl_csr_export($csr, $csrout);
  386. $sscert = openssl_csr_sign($csr, NULL, $privkey, 365, $configargs);
  387. openssl_x509_export($sscert, $certout);
  388. }
  389. else {
  390. echo "<ul>\n";
  391. foreach($errors as $error) {
  392. echo '<li>'.$error."</li>\n";
  393. }
  394. echo "</ul>\n";
  395. }
  396. }
  397.  
  398. ?>
  399. <form method="post">
  400. <?=$fields['countryName'][$language]; ?>: <select name="countryName">
  401. <?php
  402. foreach($countries as $country) {
  403. switch($language) {
  404. case 'ru':
  405. echo ' <option value="'.$country[0].'"'.((isset($_POST['countryName']) && $_POST['countryName'] === $country[0]) ? ' selected' : '').'>'.$country[2].'</option>'."\n";
  406. break;
  407. case 'en':
  408. echo ' <option value="'.$country[0].'"'.((isset($_POST['countryName']) && $_POST['countryName'] === $country[0]) ? ' selected' : '').'>'.$country[1].'</option>'."\n";
  409. break;
  410. }
  411. }
  412. ?>
  413. </select><br>
  414. <?php
  415. foreach($fields as $key => $value) {
  416. if($key === 'countryName') {
  417. continue;
  418. }
  419. echo ' '.$fields[$key][$language].': <input name="'.$key.'" type="text" value="'.((isset($_POST[$key])) ? $_POST[$key] : '').'"><br>'."\n";
  420. }
  421. ?>
  422. <input type="submit">
  423. </form>
  424.  
  425. <?php
  426. if(isset($pkeyout) && isset($csrout) && isset($certout) && $_POST) {
  427. echo "Private key:<br>\n".'<textarea style="width: 560px; height: 200px;">'.$pkeyout."</textarea><br>\n";
  428. echo "CSR:<br>\n".'<textarea style="width: 560px; height: 200px;">'.$csrout."</textarea><br>\n";
  429. echo "X509:<br>\n".'<textarea style="width: 560px; height: 200px;">'.$certout."</textarea>\n";
  430. }

Report this snippet


Comments

RSS Icon Subscribe to comments

You need to login to post a comment.