OpenSSL: the TLS toolkit most stacks already link against
General purpose TLS and crypto library. Download ======== For Production Use Source code tarballs of the official releases can be downloaded from openssl-library.org/source/.
At a glance
- What is it?
- OpenSSL is a C library and command line tool for TLS, DTLS and QUIC, built on a general purpose crypto library. The project ships source tarballs only, expects most Linux users to link the distributor's shared libraries, and its 4.0 line is the current release train.
- Who is it for?
- Adopt OpenSSL if you are writing C, C++ or bindings that need TLS, DTLS or QUIC and you can absorb the build and ABI work, or if you need a command line tool for certificate and connection inspection. Do not adopt it as your first cryptography API if you are working in a high level language that already ships a maintained TLS stack, and do not treat the command line tool as a substitute for an audited protocol library in your own code.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 4 days ago.
- What is it written in?
- Mainly C, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 25, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What OpenSSL actually provides to a C or C++ project
OpenSSL is not one thing. The README lists three: libssl, which implements TLS up to TLSv1.3 (RFC 8446), DTLS up to DTLSv1.2 (RFC 6347) and QUIC version 1 (RFC 9000); libcrypto, a general purpose cryptographic library that libssl is built on and that can be used on its own; and the openssl command line tool, described in the README as a Swiss Army knife for cryptographic tasks, testing and analyzing.
The audience is narrow and specific. If you are writing C or C++ and you need a TLS client or server, or you need primitives such as digests, ciphers and key handling without a TLS handshake, libcrypto is the piece you link. If you are scripting certificate work, the command line tool is the piece you run. Most readers of this page will never link libssl directly, because their language runtime or web server already does it for them. That is the honest framing: OpenSSL is infrastructure, and the majority of its users consume it indirectly through curl, nginx, Python's ssl module or a similar layer.
The project also ships a cryptographic module validated to conform with FIPS standards, documented separately in README-FIPS.md. That matters for regulated deployments, and it adds build complexity that has nothing to do with TLS itself.
The provider architecture behind libcrypto in the 3.x and 4.x lines
The README points to README-PROVIDERS.md for the provider architecture, which is the structural change that separates OpenSSL 3.x and 4.x from the 1.1.1 era. Rather than compiling algorithms into libcrypto as a fixed set, the library loads providers that supply implementations, and the FIPS validated module is one such provider. The practical consequence is that algorithm availability becomes a runtime question, not only a compile time one. A build that links cleanly can still fail to find a digest or cipher if the provider that supplies it is not loaded.
That design is what makes the FIPS story possible without forking the library, and it is also the source of the most common migration friction. Code that reached for an algorithm by name and assumed it was present now has to contend with a provider that may or may not be configured. The README directs anyone upgrading from a previous version to the ossl-guide-migration(7ossl) manual page, which is where that friction is documented.
QUIC is handled the same way at the protocol layer: README-QUIC.md covers the implementation, and the repository carries dedicated CI workflows for QUIC interop. QUIC support is one of the reasons a project already on 1.1.1 has a reason to move, beyond the fact that 1.1.1 predates the provider model entirely.
Installing OpenSSL: source tarballs, distributor packages, and a first s_client run
The README is explicit that the OpenSSL project does not distribute the toolkit in binary form. Official releases are source tarballs from openssl-library.org/source/. For Linux and other Unix systems, the README says it is normally recommended to link against the precompiled shared libraries provided by the distributor or vendor, and third party binaries for other operating systems, Windows included, are listed on the project wiki's Binaries page. So there are two paths, and they are not equivalent.
If you want the source, clone the public GitHub mirror and read INSTALL.md, which the README names as the detailed build and installation reference. The mirror is updated automatically from the main repository on every commit. The README gives the clone command as follows.
git clone https://github.com/openssl/openssl.gitINSTALL.md is the file that governs the rest, and it is amended per platform by NOTES-UNIX.md, NOTES-WINDOWS.md, NOTES-ANDROID.md, NOTES-VMS.md, NOTES-DJGPP.md, NOTES-PERL.md and NOTES-VALGRIND.md. The README does not reproduce the configure and make sequence here, so treat INSTALL.md as the authority rather than any snippet you find elsewhere.
Once an openssl binary is on your PATH, the first genuinely useful thing to run is a TLS handshake against a host you control or a public one. The README lists SSL/TLS/DTLS client and server tests among the tool's capabilities. You should see the certificate chain the server presents and the negotiated protocol version and cipher. That output is the same material you would otherwise need a browser's developer tools to inspect. Checking which build you are running is worth doing first, because distributor packages and hand built copies frequently coexist on the same machine.
The README does not document a rollback procedure for a build, and it does not promise that a locally built library will be the one your system's other programs load. On a typical Unix system the distributor's shared libraries are what most binaries link against, and replacing them is a system level operation with consequences beyond this project.
Where OpenSSL is the wrong choice
The clearest limitation is the one in the README itself: no binaries. If you need OpenSSL on Windows and you are not prepared to build it, you are dependent on a third party listed on the project wiki, and the README does not vouch for those builds. That is a real gap for anyone whose question is simply how to get a working openssl.exe.
A second limitation is scope. OpenSSL is a cryptography and protocol library, not an application security layer. It will perform a handshake and validate a chain, and it will not tell you whether your certificate pinning policy is correct, whether your cipher configuration matches your compliance regime, or whether your key storage is sound. Teams sometimes reach for openssl as though it were a security review, and it is not.
Third, the provider model is a genuine migration cost, not a cosmetic one. Anyone moving from 1.1.1 has to read the migration guide and re-examine code that assumed algorithms were always present. The README points to that guide rather than summarizing it, which is a reasonable choice for a project of this size but means the upgrade path is not something you can absorb from the front page.
Finally, if you are working in a language with its own maintained TLS implementation, linking OpenSSL directly buys you little and costs you a native build dependency. The library is at its most valuable when you are already in C or C++.
OpenSSL against language-native TLS stacks
The realistic alternative for most application developers is not another C library but the TLS implementation that ships with their language or platform. Go has crypto/tls in its standard library. Rust projects commonly reach for rustls. Java has its own JSSE provider. The difference in approach is not primarily about protocol coverage, since all of these speak TLS 1.3. It is about where the trust boundary sits and what you have to maintain.
A language-native stack is compiled with your program, versioned with your program, and updated by the same dependency tooling. OpenSSL, when linked, is a system library with its own release cadence and its own patching story, and a vulnerability in it becomes an operational event that touches every binary on the host. That is exactly why distributions patch it centrally, and it is also why a statically linked copy inside your application can quietly fall behind.
Where OpenSSL wins is breadth. DTLS, QUIC, S/MIME handling, the FIPS validated module, and a command line tool that can generate a CSR or inspect a chain without writing any code are not things you get from a typical language standard library. If your requirements include any of those, the comparison stops being close. If your requirement is an HTTPS client in a high level language, the language stack is usually the better default and OpenSSL is the thing underneath it.
Maintenance, release lines and what the Apache-2.0 licence means here
The repository is not archived, and the last push was on 2026-08-25, which is recent enough that active development is a fair description. The release list shows three parallel lines updated on the same day: openssl-4.0.2, openssl-3.6.4 and openssl-3.5.8. That pattern is the maintenance model in miniature. Multiple stable branches receive releases at once, so upgrading is a choice of line rather than a single track, and staying on an older line is a supported position for a while rather than an immediate problem.
The cost of that model is that you must track branch lifetimes yourself. The README does not publish an end of life schedule, so the place to look is the project's own release policy documentation rather than this page. What the README does tell you is that migration between major lines is documented in ossl-guide-migration(7ossl), which is the artifact to read before you commit to a jump.
On licensing, OpenSSL is under the Apache License 2.0. The README states that this means you are free to get and use it for commercial and non-commercial purposes as long as you fulfil its conditions, and points to LICENSE.txt for the terms. The practical implication for adopters is that Apache-2.0 is a permissive licence with an explicit patent grant, which is generally easier to reconcile with commercial distribution than the pre-3.0 dual OpenSSL/SSLeay licence was. Whether your specific distribution model satisfies the conditions is a question for your own legal review, and the README does not answer it.
The README also carries a legality note: a number of nations restrict the use or export of cryptography, and it advises seeking legal advice if you may be subject to such restrictions. That is not boilerplate to skip if you ship across borders.
Editorial conclusion
Adopt OpenSSL if you are writing C, C++ or bindings that need TLS, DTLS or QUIC and you can absorb the build and ABI work, or if you need a command line tool for certificate and connection inspection. Do not adopt it as your first cryptography API if you are working in a high level language that already ships a maintained TLS stack, and do not treat the command line tool as a substitute for an audited protocol library in your own code. Before committing, check which release line your distributor packages, read the ossl-guide-migration(7ossl) page if you are moving from 1.1.1 or 3.0, and confirm whether your build needs the FIPS provider.
Frequently asked questions
What is OpenSSL used for?
It provides libssl for TLS, DTLS and QUIC, libcrypto as a general purpose cryptographic library that can be used stand-alone, and the openssl command line tool for tasks such as creating keys, X.509 certificates, CSRs and CRLs, computing digests, and running client and server tests.
Is OpenSSL used in Windows?
The README says the project does not distribute the toolkit in binary form, but that third parties produce OpenSSL binaries for various operating systems including Windows, listed on the Binaries page of the project wiki. There is also a NOTES-WINDOWS.md file in the repository for platform specific build instructions.
How can I install OpenSSL?
For production, the README points to source tarballs at openssl-library.org/source/, and on Linux and other Unix systems it recommends linking against the precompiled shared libraries from your distributor or vendor instead. If you build from source, INSTALL.md is the detailed reference, with per platform notes such as NOTES-UNIX.md and NOTES-WINDOWS.md.
How can I use OpenSSL on Windows 11?
The README does not cover Windows 11 specifically. It states that the project ships no binaries, that third party Windows builds are listed on the project wiki's Binaries page, and that NOTES-WINDOWS.md carries the platform notes for building from source.
How do I use openssl s_client?
The README lists SSL/TLS/DTLS client and server tests among the command line tool's capabilities, and the tool is described as usable for connection testing. The README does not print a worked s_client example.
How do I use the openssl command?
The README describes the openssl command line tool as a Swiss Army knife for cryptographic tasks, testing and analyzing, covering key parameter creation, X.509 certificates, CSRs and CRLs, message digests, encryption and decryption, and S/MIME mail handling.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/openssl-openssl)
Community notes