SSL-sertifikaattigeneraattori

Syötä lomakkeeseen tiedot, niin palvelin generoi itse allekirjoitetun SSL-RSA-sertifikaatin. Palvelimen nimi on pakollinen, muut tiedot voi jättää täyttämättä.

Palvelin:
Ylläpitäjän sähköpostiosoite:
Organisaatio:
Avaimen koko:
bittiä

Lähdekoodit

index.php

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
	<title>SSL-sertifikaattigeneraattori</title>
	<style type="text/css">
		dt {
			width: 15em;
			float: left;
		}
		dd {
			margin-left: 15em;
		}
	</style>
</head>
<body>
	<h1>SSL-sertifikaattigeneraattori</h1>
	<p>Syötä lomakkeeseen tiedot, niin palvelin generoi itse allekirjoitetun SSL-RSA-sertifikaatin. Palvelimen nimi on pakollinen, muut tiedot voi jättää täyttämättä.</p>
	<form action="gen.php" method="post">
		<dl>
			<dt>Palvelin:</dt><dd><input type="text" name="domain" placeholder="esimerkki.fi" pattern="[-.a-zA-Z0-9]+" /></dd>
			<dt>Ylläpitäjän sähköpostiosoite:</dt><dd><input type="text" name="email" placeholder="admin@esimerkki.fi" pattern="[-.a-zA-Z0-9+@]*" /></dd>
			<dt>Organisaatio:</dt><dd><input type="text" name="org" value="Esimerkki" pattern="[-.a-zA-Z0-9+@ :,]*" /></dd>
			<dt>Avaimen koko:</dt><dd><select name="bits"><option value="512">512</option><option value="1024">1024</option><option value="2048" selected>2048</option><option value="3072">3072</option></select> bittiä</dd>
		</dl>
		<button type="submit">Generoi!</button>
	</form>

	<h2>Lähdekoodit</h2>
	<?php foreach (array("index.php", "gen.php") as $f): ?>
		<h3><?= htmlspecialchars($f); ?></h3>
		<pre><?= htmlspecialchars(file_get_contents($f)); ?></pre>
	<?php endforeach; ?>
</body>
</html>

gen.php

<?php
$lukko = new class {
	private $f;
	public function __construct() {
		$this->f = fopen(__FILE__, "r");
		if (!flock($this->f, LOCK_EX)) {
			throw Exception("Lukitusvirhe!");
		}
	}
	public function __destruct() {
		flock($this->f, LOCK_UN);
	}
};

sleep(1);
$domain = preg_replace("#[^-.a-zA-Z0-9]#s", "", $_POST["domain"] ?? null);
$email = preg_replace("#[^-.a-zA-Z0-9+@]#s", "", $_POST["email"] ?? null);
$org = preg_replace("#[^-.a-zA-Z0-9+@ :,]#s", "", $_POST["org"] ?? null);
$bits = intval($_POST["bits"] ?? null);
$days = floor((0x7ffff000 - time()) / (24 * 60 * 60));

if (!$domain) die("Tarkista palvelimen osoite.");
if (!in_array($bits, array(512, 1024, 2048, 3072))) die("Tarkista avaimen koko.");

$subj = "/CN=$domain";
if ($org) $subj .= "/O=$org";
if ($email) $subj .= "/emailAddress=$email";

header("Content-Type: text/plain; charset=UTF-8");
header("Cache-Control: no-store");
echo shell_exec("
 (
  echo 'Generating certificate:'
  DATA=$(openssl req -x509 -config /dev/fd/0 -subj '$subj' -newkey rsa:$bits -days $days -passout pass:asdf -keyout /dev/fd/1 -out /dev/fd/1 <<<'
   RANDFILE=/dev/null
   distinguished_name=req_dn
   [req_dn]
  ');
  echo
  echo
  echo 'domain.key; this is the private key, keep it safe!'
  openssl rsa -passin pass:asdf <<<\"\$DATA\"
  echo
  echo 'domain.crt; this is the certificate.'
  openssl x509 <<<\"\$DATA\"
  echo
  echo 'Information:'
  echo
  openssl rsa -passin pass:asdf -text <<<\"\$DATA\"
  echo
  openssl x509 -text <<<\"\$DATA\"
 ) 2>&1"
);
die();