#language cs
----
'''česky''' | [[Technology/KnowledgeBase/WebAppCertLogin/dotProject|english]]
----
. '''NOTA BENE - ROZPRACOVÁNO''' - [[Technology/KnowledgeBase/WebAppCertLogin/dotProject#Inputs_.26_Thoughts| Vaše příspěvky a úvahy]] :-)
. '''Pro Technologii''' '''[[Technology#Technology_Knowledge_Base| báze znalostí]]''' - '''Pro Technologii''' '''[[Technology/KnowledgeBase| báze znalostí - přehled]]''' - '''Pro Technologii báze znalostí -''' '''[[Technology/KnowledgeBase/WebAppCertLogin| přihlášení certifikátem k webové aplikaci]]'''
----
== Řízení projektu dotProject - přihlášení certifikátem ==
. Napsal '''[[MarkusWarg| Markus Warg]]'''
. Tento dokument pojednává o integraci podpory klientských certifikátů do projektu dotproject verze 2.1.2 (http://www.dotproject.net/).
. Dotproject je balíček, který nabízí funkčnost řízení projektu založenou zcela na webu a open source (otevřeném zdrojovém programu), nahlédněte do dokumentace, pokud Vás téma zajímá. Bohužel to vypadá, že vývoj je právě teď pozastaven, přesto stojí za to do něj nahlédnout.
. Budete potřebovat webový server se zapnutým režimem SSL a účet u CACert pro vytvoření serverového a klientského certifikátu (i když by měl fungovat i s jakýmikoli sebou podepsanými certifikáty).
<
>
== Teorie ==
. Protože SSLVerifyClient=optional (nepovinný) je označen v některých dokumentech jako "nemusí fungovat s každým prohlížečem", rozhodl jsem se použít SSLVerifyClient=required (povinný). dotproject používá relace, které docela jasně určují postup: zavést novou přihlašovací stránku, povolit pro ni SSLVerifyclient=required, vytvořit relaci a vrátit se do normálního webového grafického uživatelského rozhraní (GUI).
. Tato metoda by měla fungovat pro všechny projekty, které mají přihlašovací stránku a ukládají si do relace stav přihlášení. Nebude to fungovat s Apache BasicAuth.
<
>
== Konfigurace Apache ==
. Stačí přidat
. SSLEngine On
. SSLCertificateFile /etc/ssl/private/mykey.pem
. SLCertificateKeyFile /etc/ssl/private/mykey.pem
. SLCACertificateFile /etc/ssl/private/cacert.ca
. k Vaší konfiguraci virtuálního stroje, zaměnit "mykey" názvem souboru s Vaším serverovým certifikátem.
. Dále přidejte příkaz Files k zapnutí SSLVerifyClient:
.
. SSLVerifyClient required
. SSLVerifyDepth 2
. SSLOptions +StdEnvVars
.
. To aktivuje POVINNOU podporu SSLVerifyClient pro jediný soubor (certlogin.php).
<
>
== Kód ==
. Potřebujete záplatovat nějaký zdrojový kód a soubory s překladem, abyste oznámili, že html potřebuje klientský certifikát:
. Upravte style/*/login.php a přidejte odkaz na certlogin.php k obvyklému přihlašovacímu oknu; pro výchozí styl vložte mezi tlačítko Submit a sekci obnovy ztraceného hesla tento kód:<
>
{{{
_('certLogin');?> |
}}}
. Nyní přidejte překlad pro "certLogin" do locales//common.inc - formát by měl být zcela zřejmý, přidejte jen řádek pro certLogin a zadejte svůj upřednostňovaný text.
. Kopírujte index.php do certlogin.php a aplikujte určité záplaty (patche); viz patch a modifikovaný blok jako celek:
{{{
$ diff index.php certlogin.php:
120c120
< if (isset($_REQUEST['login'])) {
---
> if (isset($_REQUEST['loginCRT'])) {
122,124c122,124
< $username = dPgetCleanParam( $_POST, 'username',
< $password = dPgetCleanParam( $_POST, 'password',
< $redirect = dPgetCleanParam( $_REQUEST, 'redirect',
---
> $username = dPgetCleanParam( $_SERVER, 'SSL_CLIENT_S_DN_Email',
> $signingca = dPgetCleanParam( $_SERVER, 'SSL_CLIENT_I_DN_O',
> $redirect = '/';
128c128
< $ok = $AppUI->login( $username, $password );
---
> $ok = $AppUI->loginCRT( $username, $signingca );
}}}
. Záplatovaný blok jako celek:
{{{
if (isset($_REQUEST['loginCRT'])) {
$username = dPgetCleanParam( $_SERVER, 'SSL_CLIENT_S_DN_Email',
$signingca = dPgetCleanParam( $_SERVER, 'SSL_CLIENT_I_DN_O',
$redirect = '/';
$AppUI->setUserLocale();
@include_once( DP_BASE_DIR.'/locales/'.$AppUI->user_locale.'/locales.php' );
@include_once DP_BASE_DIR.'/locales/core.php';
$ok = $AppUI->loginCRT( $username, $signingca );
if (!$ok) {
$AppUI->setMsg( 'Login Failed');
} else {
//Register login in user_acces_log
$AppUI->registerLogin();
}
addHistory('login', $AppUI->user_id, 'login', $AppUI->user_first_name . ' ' . $AppUI->user_last_name);
$AppUI->redirect($redirect);
}
}}}
. Jak vidíte, je tu zavedena nová funkce: loginCRT, kterou potřebujeme také přidat. Upravte soubor classes/ui.php. Pořiďte si kopii přihlašovací funkce a modifikujte těchto několik řádků kódu:
{{{
function loginCRT($username, $signingca) {
...
if (@$_REQUEST['loginCRT'] != 1 && @$_POST['login'] != 'login' ...
...
if (!$auth->authenticateCRT($username, $signingca)) {
return false;
}
...
}
}}}
. Nakonec upravte classes/authenticator.class.php a přidejte novou metodu ke třídě v tomto souboru (předpokládám, že používáte SQLAuthenticator, u jiných metod identifikace se může kód lišit):
{{{
class SQLAuthenticator
...
function authenticateCRT($username, $signingca)
{
$userdata = array('markus' => array('crt_email' => 'markus@cacert.org',
'crt_serial' => 'yourserialnumberhere', 'crt_signingca' => 'CAcert Inc.')
);
foreach ($userdata as $key => $value) {
if ($value['crt_email'] == $username && $value['crt_signingca'] = $signingca) {
$this->username = $key;
$q = new DBQuery;
$q->addTable('users');
$q->addQuery('user_id, user_password');
$q->addWhere("user_username = '$key'");
if (!$rs = $q->exec()) {
$q->clear();
return false;
}
if (!$row = $q->fetchRow()) {
$q->clear();
return false;
}
$this->user_id = $row["user_id"];
$q->clear();
return true;
}
}
return false;
}
}}}
. Tohle sice na první pohled vypadá docela hloupě, ale funguje to na důkaz správnosti koncepce. Můžete ještě přidat kód k vyhledání crt_email, crt_signca a pořadového čísla v databázi, ale v principu jste výše popsanými kroky skončili.
<
>
----
== Příspěvky a úvahy ==
. YYYYMMDD-Vaše_jméno
. {{{
Text / Vaše názory, úvahy a výňatky e-mailů, prosím
}}}
----
. YYYYMMDD-Vaše_jméno
. {{{
Text / Vaše názory, úvahy a výňatky e-mailů, prosím
}}}
----
<
> '''Kategorie'''<
>
CategoryGuides <
>
CategorySoftware <
>
CategoryCommunity