<?xml version="1.0" encoding="ISO-8859-1" ?>
<!--
  ~  Licensed to the Apache Software Foundation (ASF) under one
  ~  or more contributor license agreements.  See the NOTICE file
  ~  distributed with this work for additional information
  ~  regarding copyright ownership.  The ASF licenses this file
  ~  to you under the Apache License, Version 2.0 (the
  ~  "License"); you may not use this file except in compliance
  ~  with the License.  You may obtain a copy of the License at
  ~
  ~   http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~  Unless required by applicable law or agreed to in writing,
  ~  software distributed under the License is distributed on an
  ~   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~  KIND, either express or implied.  See the License for the
  ~  specific language governing permissions and limitations
  ~  under the License.
  -->

<document>

	<properties>
		
	</properties>

	<body>
        <h1>Apache Rampart - Axis2 Security Module</h1>
		<section name="Welcome to Apache Rampart">
			<p>Rampart is the security module of Axis2. It secures SOAP messages
according to specifications in the WS-Security stack. Rampart implements the
following specifications:</p>
		</section>
		
		<h2>Features of Rampart Latest Version</h2>
		
		    <ul>
                <li>WS - Security 1.0</li>
                <li>WS - Security 1.1</li>
                <li>WS - Secure Conversation - February 2005</li>
                <li>WS - Security Policy - 1.1 - July 2005</li>
                <li>WS - Security Policy - 1.2 </li>
                <li>WS - Trust - February 2005</li>
                <li>WS - Trust - WS-SX spec - EXPERIMENTAL</li>
            </ul>
         
        <h2>Apache Rampart News</h2>
		<h3>Jun 06, 2011 : Apache Rampart 1.6.0 released</h3>
        Apache Rampart 1.6.0 was released with lots of bug fixes.<br></br>
    
		<h3>Jan 10, 2011 : Apache Rampart 1.5.1 released</h3>
        Apache Rampart 1.5.1 was released with lots of bug fixes.<br></br>

		<h3>Feb 01, 2010 : Apache Rampart 1.5 released</h3>
        Apache Rampart 1.5 was released with lots of bug fixes and new features.<br></br>
        New features include
            <ul>
                <li>SAML 2.0 support - Issuance </li>
                <li>Key store caching</li>
                <li>Signing / Encrypting with multiple keys</li>
                <li>Tests for negative scenarios</li>
            </ul>
        <h3>Jun 12, 2008 : Apache Rampart 1.4 released</h3>  
        <p>Apache Rampart 1.4 was released with lots of bug fixes and new features.<br></br>
        New features include</p>
            <ul>
                <li>WS Security 1.1</li>
                <ul>
                   <li>Encrypted headers</li>
                   <li>Encrypted SHA1 references</li>
                </ul>
                <li>WS Security Policy 1.2 support</li>
                <li>WS Trust</li>
                <ul>
                    <li>Renew binding</li>
                    <li>Validation binding</li>
                </ul>
                <li>New configuration options</li>
                <ul>
                    <li>Ability to plug in Custom policy validators</li>
                    <li>Ability to define certAlias different from username for signature</li>
                    <li>Ability turn off mili second precision</li>
                </ul>
                <li>Ability to secure messages faults </li>
                <li>Increased interoparability with WCF 3.5 </li>
            </ul>   
	</body>
</document>
