Let's Encrypt/ACME Command Line client written in PHP

Related tags

Security acmephp
Overview

Acme PHP

Build Status StyleCI Packagist Version Software License

SymfonyInsight

Acme PHP is a simple yet very extensible CLI client for Let's Encrypt that will help you get and renew free HTTPS certificates.

Acme PHP is also an initiative to bring a robust, stable and powerful implementation of the ACME protocol in PHP. Using the Acme PHP library and core components, you will be able to deeply integrate the management of your certificates directly in your application (for instance, renew your certificates from your web interface). If you are interested by these features, have a look at the acmephp/core and acmephp/ssl libraries.

If you want to chat with us or have questions, ping @tgalopin or @jderusse on the Symfony Slack!

Why should I use Acme PHP when I have an official client?

Acme PHP provides several major improvements over the default clients:

  • Acme PHP comes by nature as a single binary file: a single download and you are ready to start working ;
  • Acme PHP is based on a configuration file instead command line arguments. Thus, the configuration is much more expressive and the same setup is used at every renewal ;
  • Acme PHP is very extensible it to create the certificate files structure you need for your webserver. It brings several default formatters to create classical file structures (nginx, nginx-proxy, haproxy, etc.) but you can very easily create your own if you need to ;
  • Acme PHP follows a strict BC policy preventing errors in your scripts or CRON even if you update it (see the Backward Compatibility policy of Acme PHP for more informations) ;

Documentation

Read the official Acme PHP documentation.

Backward Compatibility policy

Acme PHP follows a strict BC policy by sticking carefully to semantic versioning. This means your scripts, your CRON tasks and your code will keep working properly even when you update Acme PHP (either the CLI tool or the library), as long as you keep the same major version (1.X.X, 2.X.X, etc.).

Launch the Test suite

The Acme PHP test suite uses the Docker Boulder image to create an ACME server. To launch the test suite, you need to setup the proper Docker environment for the suite. Useful scripts are available under the tests directory: in the Acme PHP root directory, execute the following:

# Create the Docker environment required for the suite
sudo tests/setup.sh

# Run the tests
tests/run.sh

# Clean the docker environment
tests/teardown.sh

Note: you may have boulder errors sometimes in tests. Simply ignore them and rerun the suite, they are due to an issue in the container DNS.

Warning: as the acmephp/testing-ca Docker image needs to be mapped to the host network, you may have ports conflicts. See https://github.com/acmephp/testing-ca for more informations.

Run command

The run command is an all in one command who works with a domain config file like

contact_email: contact@company
key_type: RSA                                          # RSA or EC (for ECDSA). Default "RSA"

defaults:
  distinguished_name:
      country: FR
      locality: Paris
      organization_name: MyCompany
  solver: http

certificates:
  - domain: example.com
    distinguished_name:
      organization_name: MyCompany Internal
    solver: route53
    subject_alternative_names:
      - '*.example.com'
      - www.subdomain.example.com
    install:
      - action: install_aws_elb
        region: eu-west-1
        loadbalancer: my_elb
  - domain: www.example.com
    solver:
      name: http-file
      adapter: ftp                                     # ftp or sftp or local, see https://flysystem.thephpleague.com/
      root: /var/www/
      host: ftp.example.com
      username: username
      password: password
      # port: 21
      # passive: true
      # ssl: true
      # timeout: 30
      # privateKey: path/to/or/contents/of/privatekey

usage

$ acmephp run path-to-config.yml

Using docker

You can also use the docker image to generate certificates. Certificates and keys are stored into the volume /root/.acmephp

docker run --rm -ti -v /cache/.acmephp:/root/.acmephp -v $PWD/.config.yml:/etc/acmephp.yml:ro acmephp/acmephp:latest run /etc/acmephp.yml
Comments
  • Authorization challenge expired [solution?]

    Authorization challenge expired [solution?]

    Hi guys,

    we have a problem to renew certificates, because we get an authorization errors. The real issue is that let's encrypt has changed (in January) the expire date of the authorization challenges from 60days to 30days (according to this: https://community.letsencrypt.org/t/upcoming-api-changes/17947).

    Acutally, let's encrypt send us an email 10days before our certificate expire, but if we renew the certificate only 10days before with acmephp we get an error saying that we don't have authorization. So we need to re-run the whole authorization process and get a new certificate.

    You can try to see your active authorization in .acmephp/master/private/yourdomain.com/authorization_challenge.json. Try to make a request to the url that you find in the "url" key: if you get a 404, you need to re-run the authorization, otherwise, you can make a renew.

    What we can do? Run the renew each month, when the authorization is still valid.

    It's sound strange that let's encrypt (with 100.000.000 certs) can't get an authorization more than 30days, but I think that the problem we got to renew a certificate is this one.

    opened by TheJoin95 29
  • Unable to renew certificate?

    Unable to renew certificate?

    I am unable to renew the certificates on my 2 domains. One has already expired, the other is about to. I updated to the beta-2 and reran the commands with no luck. The cert files and such are also not being updated. Any idea what I could be doing wrong here?

    http://i.imgur.com/jWAagJl.png

    opened by AnExiledDev 17
  • Allow custom challenger extension

    Allow custom challenger extension

    • [x] Tests
    • [x] Rename challenger into ChallengeSolver
    • [x] I don't like the "output" directly in challenger. The solver should "speak". => Maybe add method (getSolvingRecommendations)
    opened by jderusse 10
  • ECDSA certificate support?

    ECDSA certificate support?

    ECDSA certificate signing is a completed feature of Let's Encrypt as of February, and ECDSA intermediates are expected by April 2017. Do you plan on making ECDSA certificate signing an option in the beta release?

    Feature request 
    opened by cmorgenstern 10
  • dns-01 Challenge

    dns-01 Challenge

    Hi @tgalopin,

    You mentioned in #3 that if I had any other questions, feel free to ask, so I'm cashing in on that offer. ;)

    So I have just a few.

    1. With the dns-01 challenge (yet to be implemented here, but I know it's on the todo list), it should automatically cover any subdomains in the certificate's Subject Alternate Name right? For instance if the certificate were for mydomain.com and the SAN had www.mydomain.com a single, successful dns-01 challenge that had the appropriate TXT record would be sufficient to cover both, and we could then get a certificate?
    • Right now we are having to issue two http-01 challenges, one for mydomain.com, and another for www.mydomain.com, (even though they point to the same IP in 99% of cases) so we're trying to streamline that process if possible. And my thought was that implementing the dns-01 challenge might solve that. I'm not sure.
    1. If I'm correct about that, are you already working on implementing the dns-01 challenge? We were thinking about forking the code and submitting a PR, but I'm sure you would be able to do it faster than us and probably already have an idea on how you want to design the code to handle this, especially if you're already working on it.

    Thanks again for the awesome library

    opened by kevinquinnyo 10
  • Change default solver method for wildcard domains

    Change default solver method for wildcard domains

    Running bin/acme authorize '*.domain.ext' gives following error -

    In AuthorizeCommand.php line 95:
    
      This ACME server does not expose supported challenge.
    

    In such case, acmephp should set dns as default resolver(If the domain starts with *)

    if user specifies any non-dns solver, then error should be thrown that non-dns solvers are not allowed by acme in wildcard domains.

    Bug 
    opened by kirtangajjar 9
  • Another problem renewing certificates

    Another problem renewing certificates

    Everything looks fine in the CLI output...

    $ php acmephp.phar --version
    Acme PHP - Let's Encrypt client version 1.0.0-beta2
    
    $ php acmephp.phar -n -v request art-und-weise.org -a www.art-und-weise.org
    Loading account key pair...
    Current certificate will expire in less than a week (2016-12-25 14:07:00), renewal is required.
    Loading domain key pair...
    Loading domain distinguished name...
    Renewing certificate for domain art-und-weise.org ...
    

    ... however, the certs remain untouched:

    $ ll .acmephp/master/certs/art-und-weise.org/
    total 28
    drwxr-s---+ 2 vm-admin www   76 26. Sep 15:40 .
    drwxr-s---+ 4 vm-admin www   60 24. Okt 17:19 ..
    -rw-------+ 1 vm-admin www 2179 26. Sep 17:07 cert.pem
    -rw-------+ 1 vm-admin www 1647 26. Sep 17:07 chain.pem
    -rw-------+ 1 vm-admin www 7098 26. Sep 17:07 combined.pem
    -rw-------+ 1 vm-admin www 3826 26. Sep 17:07 fullchain.pem
    

    ... whereas distinguished_name.json is loaded:

    $ ll .acmephp/master/private/art-und-weise.org/
    total 28
    drwxr-s---+ 2 vm-admin www  106 26. Sep 15:40 .
    drwxr-s---+ 8 vm-admin www 4096 24. Okt 17:10 ..
    -rw-------+ 1 vm-admin www  414 26. Sep 12:39 authorization_challenge.json
    -rw-------+ 1 vm-admin www  286 20. Dez 16:59 distinguished_name.json
    -rw-------+ 1 vm-admin www 3272 26. Sep 15:39 private.pem
    -rw-------+ 1 vm-admin www  800 26. Sep 15:39 public.pem
    

    My environment:

    $ php --version
    PHP 5.5.38-pl0-gentoo (cli) (built: Dec  5 2016 13:22:50) 
    Copyright (c) 1997-2015 The PHP Group
    Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
        with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    

    When testing with beta-3, I received:

    Loading account key pair...  
    Current certificate will expire in less than a week (2016-12-25 14:07:00), renewal is required.  
    Loading domain key pair...  
    Loading domain distinguished name...  
    Renewing certificate for domain art-und-weise.org ...  
    
      [AcmePhp\Core\Exception\Server\UnauthorizedServerException (403)]                                                                                                                                                           
      [unauthorized] The client lacks sufficient authorization: Error creating new cert :: Authorizations for these names not found or expired: art-und-weise.org, www.art-und-weise.org (on request "POST https://acme-v01.api.
    letsencrypt.org/acme/new-cert") 
    

    What can be done to avoid an unpleasant christmas surprise? Thanks for your support.

    Bug 
    opened by dfritschy 9
  • Add support for ECDSA

    Add support for ECDSA

    Fixes #23

    This PR contains 1 BC break DataSigner::signData now takes a string alg (RS256, ES384, ...) instead of a int (OPENSSL_ALGO_SHA256). bacause the the method openssl_sign returns a format PKCS, wereas EC256 expect a specific format.

    opened by jderusse 8
  • Add api for certificate revocation

    Add api for certificate revocation

    First off, thanks for any time you can spend reviewing this PR! We greatly appreciate the work done on this lib and would love to give back. Revoke kind of helps round out the flow for managing a certificate.

    I took some ideas from the python library as there is not much documentation on revoke, but it's simple enough. You can revoke once, and then subsequent attempts error our with a 409.

    You must use the same account keypair used to request the certificate to sign the request.

    That's about it!

    opened by remotelyliving 7
  • Self-Update does not work in beta-2

    Self-Update does not work in beta-2

    $ php acmephp.phar --version
    Acme PHP - Let's Encrypt client version 1.0.0-beta2
    
    $ php acmephp.phar self-update
    Updating...
    
    Error: file_get_contents(): Peer certificate CN=`*.s3.amazonaws.com' did not match expected CN=`github.com'
    
    You can also select update stability using --dev, --pre (alpha/beta/rc) or --stable.
    
    Bug 
    opened by dfritschy 7
  • CertificateParser fails with CloudFlare certificates

    CertificateParser fails with CloudFlare certificates

    Hi, I have site secured by the CloudFlare DNS and it provides its own ssl certificate that handles communication from client to DNS/CloudFlare. But communication from CF to server is not encrypted so CF offers free SSL certificate(or you can upload your own) for this purpose. I have opted for the free one(since it can be valid for 15 years it you like = no hassle with updating LE). I am trying to put it into my system that handles proxying and other stuff and the CertificateParser class will fail to parse the certificate because of missing issuer[CN] value.

    So I am wondering who got this wrong - the parser or the issuer?

    Bug 
    opened by ghost 7
  • getResponseBodySummary(): Return value must be of type string, null returned

    getResponseBodySummary(): Return value must be of type string, null returned

    Logged an error every few hours in production:

    AcmePhp\Core\Http\ServerErrorHandler::getResponseBodySummary(): Return value must be of type string, null returned
    

    I think the answer is simply to adjust the return type to allow null (since \GuzzleHttp\Psr7\get_message_body_summary is capable of returning null)

    opened by splitice 0
  • website updates?

    website updates?

    git has tagged here the source for 2.1.0 but the website still tells you cli commands to get 1.0.1. im not even sure a user could use brain to get around that, as the newer tagged versions dont have the phar or signature files anymore.

    opened by bobmagicii 0
  • Error During Renewal

    Error During Renewal

    I am receiving an error when trying to renew domains using acmephp. The below command throws an error. The argument values have been redacted...

    php ~/acmephp.phar request --force --verbose --country "XXX" --province "XXX" --locality "XXX" --organization "XXX" --unit "XXX" --email "XXX" --alternative-name www.talus2.com talus2.com

    Error details are below...

    Loading account key pair...
    Forced renewal.
    Loading domain key pair...
    Loading domain distinguished name...
    Loading the order related to the domains talus2.com, www.talus2.com ...
    Renewing certificate for domain talus2.com ...

    In ServerErrorHandler.php line 107:

    [AcmePhp\Core\Exception\Server\MalformedServerException (404)]
    [malformed] The request message was malformed: No order for ID 72035838400 (on request "GET https://acme-v02.api.letsencrypt.org/acme/order/410462640/72035838400")

    Exception trace: AcmePhp\Core\Http\ServerErrorHandler->createAcmeExceptionForResponse() at phar:///home/web/acmephp.phar/src/Core/Http/SecureHttpClient.php:344 AcmePhp\Core\Http\SecureHttpClient->handleClientException() at phar:///home/web/acmephp.phar/src/Core/Http/SecureHttpClient.php:224 AcmePhp\Core\Http\SecureHttpClient->unsignedRequest() at phar:///home/web/acmephp.phar/src/Core/Http/SecureHttpClient.php:197 AcmePhp\Core\Http\SecureHttpClient->signedKidRequest() at phar:///home/web/acmephp.phar/src/Core/AcmeClient.php:225 AcmePhp\Core\AcmeClient->finalizeOrder() at phar:///home/web/acmephp.phar/src/Cli/Command/RequestCommand.php:314 AcmePhp\Cli\Command\RequestCommand->executeRenewal() at phar:///home/web/acmephp.phar/src/Cli/Command/RequestCommand.php:100 AcmePhp\Cli\Command\RequestCommand->execute() at phar:///home/web/acmephp.phar/vendor/symfony/console/Command/Command.php:255 Symfony\Component\Console\Command\Command->run() at phar:///home/web/acmephp.phar/vendor/symfony/console/Application.php:946 Symfony\Component\Console\Application->doRunCommand() at phar:///home/web/acmephp.phar/vendor/symfony/console/Application.php:248 Symfony\Component\Console\Application->doRun() at phar:///home/web/acmephp.phar/vendor/symfony/console/Application.php:148 Symfony\Component\Console\Application->run() at phar:///home/web/acmephp.phar/bin/acme:41 require() at /home/web/acmephp.phar:10

    In RequestException.php line 113:

    [GuzzleHttp\Exception\ClientException (404)]
    Client error: GET https://acme-v02.api.letsencrypt.org/acme/order/410462640/72035838400 resulted in a 404 Not Found response:
    {
    "type": "urn:ietf:params:acme:error:malformed",
    "detail": "No order for ID 72035838400",
    "status": 404
    }

    Exception trace: GuzzleHttp\Exception\RequestException::create() at phar:///home/web/acmephp.phar/vendor/guzzlehttp/guzzle/src/Middleware.php:66 GuzzleHttp\Middleware::GuzzleHttp{closure}() at phar:///home/web/acmephp.phar/vendor/guzzlehttp/promises/src/Promise.php:203 GuzzleHttp\Promise\Promise::callHandler() at phar:///home/web/acmephp.phar/vendor/guzzlehttp/promises/src/Promise.php:156 GuzzleHttp\Promise\Promise::GuzzleHttp\Promise{closure}() at phar:///home/web/acmephp.phar/vendor/guzzlehttp/promises/src/TaskQueue.php:47 GuzzleHttp\Promise\TaskQueue->run() at phar:///home/web/acmephp.phar/vendor/guzzlehttp/promises/src/Promise.php:246 GuzzleHttp\Promise\Promise->invokeWaitFn() at phar:///home/web/acmephp.phar/vendor/guzzlehttp/promises/src/Promise.php:223 GuzzleHttp\Promise\Promise->waitIfPending() at phar:///home/web/acmephp.phar/vendor/guzzlehttp/promises/src/Promise.php:267 GuzzleHttp\Promise\Promise->invokeWaitList() at phar:///home/web/acmephp.phar/vendor/guzzlehttp/promises/src/Promise.php:225 GuzzleHttp\Promise\Promise->waitIfPending() at phar:///home/web/acmephp.phar/vendor/guzzlehttp/promises/src/Promise.php:62 GuzzleHttp\Promise\Promise->wait() at phar:///home/web/acmephp.phar/vendor/guzzlehttp/guzzle/src/Client.php:106 GuzzleHttp\Client->send() at phar:///home/web/acmephp.phar/src/Core/Http/SecureHttpClient.php:222 AcmePhp\Core\Http\SecureHttpClient->unsignedRequest() at phar:///home/web/acmephp.phar/src/Core/Http/SecureHttpClient.php:197 AcmePhp\Core\Http\SecureHttpClient->signedKidRequest() at phar:///home/web/acmephp.phar/src/Core/AcmeClient.php:225 AcmePhp\Core\AcmeClient->finalizeOrder() at phar:///home/web/acmephp.phar/src/Cli/Command/RequestCommand.php:314 AcmePhp\Cli\Command\RequestCommand->executeRenewal() at phar:///home/web/acmephp.phar/src/Cli/Command/RequestCommand.php:100 AcmePhp\Cli\Command\RequestCommand->execute() at phar:///home/web/acmephp.phar/vendor/symfony/console/Command/Command.php:255 Symfony\Component\Console\Command\Command->run() at phar:///home/web/acmephp.phar/vendor/symfony/console/Application.php:946 Symfony\Component\Console\Application->doRunCommand() at phar:///home/web/acmephp.phar/vendor/symfony/console/Application.php:248 Symfony\Component\Console\Application->doRun() at phar:///home/web/acmephp.phar/vendor/symfony/console/Application.php:148 Symfony\Component\Console\Application->run() at phar:///home/web/acmephp.phar/bin/acme:41 require() at /home/web/acmephp.phar:10

    request [-f|--force] [--country COUNTRY] [--province PROVINCE] [--locality LOCALITY] [--organization ORGANIZATION] [--unit UNIT] [--email EMAIL] [-a|--alternative-name ALTERNATIVE-NAME] [--]

    opened by code-a-cola 1
  • Documentation missing? Change ACME service

    Documentation missing? Change ACME service

    Hey, I may have missed the obvious, but is there any documentation besides examples?

    The landing page https://acmephp.github.io/ tells me there are at least four command line arguments:

    # Register your account key in Let's Encrypt
    $ php acmephp.phar register [email protected]
    
    # Prove you own the domain "mydomain.com"
    $ php acmephp.phar authorize mydomain.com
    
    # Ask the server to check your proof
    $ php acmephp.phar check mydomain.com
    
    # Get the certificate!
    $ php acmephp.phar request mydomain.com
    

    On the other hand php acmephp.phar --help tells me that php acmephp.phar list would list all commands, but it lists:

    Available commands:
      help         Displays help for a command
      list         Lists commands
      revoke       Revoke a SSL certificate for a domain
      run          Automatically challenge domains and request certificates configured in the given file
      self-update  Update acmephp.phar to most recent stable, pre-release or development build.
      status       List all the certificates handled by Acme PHP
    

    There is no mention of the above commands... And it looks like they don't work (version mismatch?!).

    Well okay, https://acmephp.github.io/documentation/getting-started/2-obtain-certificate-easy.html tells me I should use php acmephp.phar run config.yml with a config-file. The example config-file is also in the readme. But other than this I cannot find any documentation what keys and values I can use in the config file, how it should be structured and what the keys/values actually do. Is this all what is available, or did I miss something?

    My basic questions are:

    • How do I set the ACME provider used? I don't want to use LetsEncrypt, I'd like to use https://acme.sectigo.com/v2/DV instead
    • How do I set the destination for the http challenge file? document root is on the local filesysem, I don't need ftp

    Thx

    opened by xsrf 0
  • padraic/phar-updater is abandoned

    padraic/phar-updater is abandoned

    opened by W0rma 0
Releases(2.1.0)
Owner
Acme PHP
Free SSL/HTTPS certificates in your PHP application (ACME/Let's Encrypt protocol)
Acme PHP
Automatic Encrypt and Decrypt your database data. Tested and used on Laravel 8

Laravel Encrypt Database Automatic Encrypt and Decrypt your database data. Tested and used on Laravel 8. I'm yet building the tests. Important Note th

Wellington Barbosa 2 Dec 15, 2021
PHPGGC is a library of PHP unserialize() payloads along with a tool to generate them, from command line or programmatically.

PHPGGC: PHP Generic Gadget Chains PHPGGC is a library of unserialize() payloads along with a tool to generate them, from command line or programmatica

Ambionics Security 2.5k Jan 4, 2023
API in PHP for DDoS Attacks (sends a command to a SSH Server from a URL)

SSH-PHP-API API in PHP for DDoS Attacks (sends a command to a SSH Server from a URL) [Install on Ubuntu 20.04: apt install apache2 php php-fpm php-ssh

Вентокс 3 Sep 23, 2022
Standards compliant HTML filter written in PHP

HTML Purifier HTML Purifier is an HTML filtering solution that uses a unique combination of robust whitelists and aggressive parsing to ensure that no

Edward Z. Yang 2.7k Jan 5, 2023
HTML sanitizer, written in PHP, aiming to provide XSS-safe markup based on explicitly allowed tags, attributes and values.

TYPO3 HTML Sanitizer ℹ️ Common safe HTML tags & attributes as given in \TYPO3\HtmlSanitizer\Builder\CommonBuilder still might be adjusted, extended or

TYPO3 GitHub Department 18 Jul 18, 2022
Password manager featuring client-side encryption, vaults, folders and more.

vaults is a password manager featuring client side AES-256 encryption, PBKDF2 hashing, vaults, password generation & more. Features Technical overview

null 27 Nov 18, 2022
PHPIDS (PHP-Intrusion Detection System) is a simple to use, well structured, fast and state-of-the-art security layer for your PHP based web application

PHPIDS PHPIDS (PHP-Intrusion Detection System) is a simple to use, well structured, fast and state-of-the-art security layer for your PHP based web ap

null 752 Jan 3, 2023
php-chmod is a PHP library for easily changing permissions recursively.

PHP chmod php-chmod is a PHP library for easily changing the permissions recursively. Versions & Dependencies Version PHP Documentation ^1.1 ^7.4 curr

Mathias Reker ⚡️ 5 Oct 7, 2022
PHP 5.x support for random_bytes() and random_int()

random_compat PHP 5.x polyfill for random_bytes() and random_int() created and maintained by Paragon Initiative Enterprises. Although this library sho

Paragon Initiative Enterprises 8k Jan 5, 2023
PHP Secure Communications Library

phpseclib - PHP Secure Communications Library Supporting phpseclib Become a backer or sponsor on Patreon One-time donation via PayPal or crypto-curren

null 4.9k Jan 7, 2023
Simple Encryption in PHP.

php-encryption composer require defuse/php-encryption This is a library for encrypting data with a key or password in PHP. It requires PHP 5.6 or new

Taylor Hornby 3.6k Jan 3, 2023
A database of PHP security advisories

PHP Security Advisories Database The PHP Security Advisories Database references known security vulnerabilities in various PHP projects and libraries.

null 1.9k Dec 18, 2022
A php.ini scanner for best security practices

Scanner for PHP.ini The Iniscan is a tool designed to scan the given php.ini file for common security practices and report back results. Currently it

psec.io 1.5k Dec 5, 2022
🤖 Id obfuscation based on Knuth's multiplicative hashing method for PHP.

Optimus id transformation With this library, you can transform your internal id's to obfuscated integers based on Knuth's integer hash. It is similar

Jens Segers 1.2k Jan 2, 2023
㊙️ AntiXSS | Protection against Cross-site scripting (XSS) via PHP

㊙️ AntiXSS "Cross-site scripting (XSS) is a type of computer security vulnerability typically found in Web applications. XSS enables attackers to inje

Lars Moelleken 570 Dec 16, 2022
An experimental object oriented SSH api in PHP

PHP SSH (master) Provides an object-oriented wrapper for the php ssh2 extension. Requirements You need PHP version 5.3+ with the SSH2 extension. Insta

Antoine Hérault 355 Dec 6, 2022
TCrypto is a simple and flexible PHP 5.3+ in-memory key-value storage library

About TCrypto is a simple and flexible PHP 5.3+ in-memory key-value storage library. By default, a cookie will be used as a storage backend. TCrypto h

timoh 57 Dec 2, 2022
Fetches random integers from random.org instead of using PHP's PRNG implementation

TrulyRandom Composer-compatible library to interact with random.org's API in order to generate truly random lists of integers, sequences of integers,

Erik Wurzer 46 Nov 25, 2022
PHP Malware Finder

PHP Malware Finder _______ __ __ _______ | ___ || |_| || | | | | || || ___| | |___| || || |___ Webshell finder, |

NBS System 205 Dec 24, 2022